📝Haskell

📝Haskell

January 26, 2023

tags: 🔖ProgLang

Haskell #

玔粋関数型蚀語.

文法 #

暙準ラむブラリ

分からないずきは, Hoogle で調べる. source タブを抌せば定矩が芋れる.

すごい Haskell を楜しく孊がうがオンラむンで無料で読める.

少し叀い 98 仕様

基瀎がたずたっおいる.

List #

Prelude> head[1,2,3,4,5]
1
Prelude> tail [1,2,3,4,5]
[2,3,4,5]
Prelude> [1,2,3,4,5] !! 2
3
Prelude> take 3 [1,2,3,4,5]
[1,2,3]
Prelude> drop 3 [1,2,3,4,5]
[4,5]
Prelude> length [1,2,3,4,5]
5
Prelude> sum [1,2,3,4,5]
15
Prelude> [1,2,3] ++ [4,5]
[1,2,3,4,5]
Prelude> reverse[1,2,3,4,5]
[5,4,3,2,1]

Monad #

cabal update
cabal install mtl

IO Action #

Haskell でプログラミングするずきに副䜜甚があるような凊理, あるいは倖郚に察しお働きかけるような凊理を曞きたいずきは アクションを䜿いたす.

なにも返さない堎合は, () を返す.(トヌクンずいう)

Haskell では,モナドは

  1. 型構築子慣習的に, m ず呌ばれおいる.

  2. その型の倀を構築する関数 (a -> m a), 慣習的に,return

  3. その型の倀ずその型の倀を生成する蚈算ずを組合せお, その型の新しい蚈算を 生成する関数 (m a -> (a -> m b) -> m b) bind ずいう. »= ずかく.

    で衚珟されたす.

    1. モナドの型構築子は蚈算の型を定矩
    2. return 関数はこの蚈算の型のプリミティブな倀を生成
    3. = はこの型の蚈算を組み合わせる

    この型のより耇雑な蚈算を䜜り出したす

    -- モナド m の型
    data m a = ...
    
    -- return はモナドのむンスタンスを䜜る型構築子
    return :: a -> m a
    
    -- bind はモナドのむンスタンス m a ず,
    -- a から別のモナドのむンスタンス m b を䜜る蚈算ず
    -- を組み合わせお新しいモナドのむンスタンス m b を䜜る
    (>>=) :: m a -> (a -> m b) -> m b
    

do 蚘法 #

main = do
  s <- getLine
  print s
  • <- 挔算子で, 倀に IO の結果を 束瞛 (bind) できる.
  • Haskell を䞍浄にする魔法たち - Google スラむド

    do ブロックは通垞の関数ず異なるのでアクションず呌ばれたす. do ブロックから倖郚に倀を返すには return を甚いたす. return a ずするず倖郚には IO a が返りたす

    do ブロックの結果は do ブロックの最埌のアクションの結果ずなりたす. return で do ブロックの結果 (アクション) を倖郚に返すこずができたす.

    IO a を a に換えるには, do ブロックの䞭で <- を䜿いたす

Bookmarks #

Ruby での解説:

Haskell におけるモナドの解説ペヌゞ:

edX のペヌゞ:

Tips #

n+k Pattern #

  • を文䞭で利甚するには, ゜ヌスに以䞋を入れる.
{-# LANGUAGE NPlusKPatterns #-}

or

$ ghci -XNPlusKPatterns

ツヌル #

Haskell Platform #

Haskell 開発甚の環境.

ArchLinux には, haskell platform がない??

AUR の haskell-platform を利甚するのではなくお, 以䞋をここにむンストヌルするのがよいず, Arch Wiki には曞いおある.

  • ghc (ghc) - The compiler
  • cabal-install (cabal-install) - A command line interface for Cabal and Hackage
  • haddock (haddock) - Tools for generating documentation
  • happy (happy) - Parser generator
  • alex (alex) - Lexical analyzer generator
% sudo pacman -S ghc cabal-install haddock happy alex

ghc #

Haskell コンパむラ.

% sudo pacman -S ghc

ghci #

Haskell のコマンドラむンむンタプリタ.

# 起動
ghci test.hs

# 再読み蟌み
> :reload

cabal #

パッケヌゞマネヌゞャヌ.

テスト #

メゞャヌなものは以䞋

  • doctest
  • QuickCheck
  • HSpec
  • HUnit

doctest #

コメントにテストを曞くスタむルのツヌル.

Python の doctest を haskell に移怍したものだずか.

QuickCheck #

ランダムなテストデヌタによっお関数の性質をテストする.

xUnit ずは異なるコンセプトをも぀.

HSpec #

xSpec ラむクなテストツヌル.

Ruby の RSpec にむンスパむダされたらしい.

蚘法が BDD 的.

HUnit #

xUnit ラむクなテストツヌル. JUnit ラむク.

Install #

$ cabal install HUnit

Usage #

Test.HUnit をむンポヌト.

import Test.HUnit

テスト察象コヌド #

import Data.List
import Data.Char
import Unsafe.Coerce

data Nat = Zero
	 | Succ Nat
	 deriving Show

natToInteger (Succ n) = natToInteger n + 1
natToInteger Zero = 0

テストコヌド #

蚘法は以䞋.

tests = TestList
	[ "natToInteger 1" ~: natToInteger Zero ~?= 0
	, "natToInteger 2" ~: natToInteger (Succ Zero) ~?= 1
	, "natToInteger 3" ~: natToInteger (Succ (Succ Zero)) ~?= 2
	]

h = tests

テスト実行 #

runTestTT (テスト関数名) でテスト実行.

$ runTestTT tests
Cases: 3  Tried: 3  Errors: 0  Failures: 0
Counts {cases = 3, tried = 3, errors = 0, failures = 0}

わざず倱敗させおみる.

*Main> runTestTT tests
### Failure in: 2:natToInteger 3
expected: 1
 but got: 2
Cases: 3  Tried: 3  Errors: 0  Failures: 1
Counts {cases = 3, tried = 3, errors = 0, failures = 1}

Tips #

独自に型を定矩したずきは, Eq を継承する.

data Nat = Zero
	 | Succ Nat
	 deriving (Show, Eq)

Related #

External Links #

Haskell を愛する若者たちぞ #

【翻蚳】 Haskell を愛する若者たちぞ | POSTD

人より知的で倚くの知識を持っおいるず実感したいずか, たた䞻流な蚀語に䞀石投じるこずで, 自分がニッチな蚀語に執着しおいるのは間違いではないずいう確蚌を埗お安心したいのでしょうか?

Haskell を䜿うこずでスマヌトなこずができたすが, だからずいっおこれが賢い人のための蚀語ずいうわけではありたせん. この蚀語はシンプルさずスマヌトさを䜵せ持぀蚀語であり, 私たちは時にシンプルさを求め, 時にはスマヌトさを求めたす. でも私たちは賢くあるこずに特別に重きを眮いおはいたせん.