GGG

プログラミング言語やソフトウェア開発について思ったことを書いてます

Haskell 最初のn歩 :関数を調べる

少しずつHaskell勉強中。

調べた関数

 

関数名

定義説明

id

入力(引数)をそのまま出力する

https://hackage.haskell.org/package/base-4.7.0.0/docs/Prelude.html#v:id


id                      :: a -> a
id x                    =  x

Prelude> id 3

3

map

よく使う高階関数(high-order-function)

https://hackage.haskell.org/package/base-4.7.0.0/docs/Prelude.html#v:map


第1引数:関数 (a -> b)

第2引数:リスト [a]

結果:リスト [b]


[a] 入力⇒ 処理(a -> b ) 出力⇒[b]

関数(a->b)を使って[a]を[b]に変換する。

---------------

map :: (a -> b) -> [a] -> [b]


map _     =
map f (x:xs) = f x : map f xs

Prelude> map id [10,20,30]

[10,20,30]

zip

ふたつのリストを合成したタプルのリストを生成する

https://hackage.haskell.org/package/base-4.7.0.0/docs/src/GHC-List.html#zip

Prelude> :t zip

zip :: [a] -> [b] -> [(a, b)]

Prelude> zip [0..] [10,20,30,40,50]

[(0,10),(1,20),(2,30),(3,40),(4,50)]


foldl

<reduce>

https://hackage.haskell.org/package/base-4.7.0.0/docs/src/GHC-List.html#foldl

リストの要素を1つの値に集約する。

方法は、関数を指定する。

(畳み込み)

第1引数:演算子

第2引数:初期値

第3引数:リスト


Prelude> :t foldl

foldl :: (b -> a -> b) -> b -> [a] -> b

Prelude> foldl (+) 0 [10,20,30,40]

100

error

ラインタイムエラーを生成する

(クラッシュさせる)

https://hackage.haskell.org/package/base-4.7.0.0/docs/src/GHC-List.html#head


Prelude> :t error

error :: [Char] -> a


Prelude>head

*** Exception: Prelude.head: empty list

errorによる出力

head                    :: [a] -> a
head (x:_)              =  x
head                 =  badHead

badHead :: a
badHead = errorEmptyList "head"


errorEmptyList :: String -> a
errorEmptyList fun =
 error (prel_list_str ++ fun ++ ": empty list")


prel_list_str :: String
prel_list_str = "Prelude."