Haskellメモ その2

日記「Haskellメモ その1 - oknknicの日記」に引き続きHaskellネタ。
今回もコマンド例、コード例を書き連ねる。

型に関して

ghci

:t 1

:t 'a'

:t "a"

let f x = x * x
:t f

let f x = length x
:t f

:q
明示的な型宣言
echo "f :: Int -> Int" > f.hs
echo "f x = x * x" >> f.hs
cat f.hs

ghci

:l f.hs

:t f

f 10

f 1.5

:q
型変数と型クラス制約
echo "f :: Num a => a -> a" > f.hs
echo "f x = x * x" >> f.hs
cat f.hs

ghci

:l f.hs

:t f

f 10

f 1.5

:q

パターンマッチ、ガード、where、再帰関数

(※ .hs ファイルとして保存することを前提として記載)

f :: (Num a , Eq a) => a -> a
f 0 = 1
f x = x * f (x - 1)
f :: (Int, Int) -> (Int, Int) -> (Int, Int)
f (x1, y1) (x2, y2) = (x1 + x2, y1 + y2)
f :: (a, a, a) -> a
f (_, _, z) = z
f :: Int -> String
f x 
 | x > 3 = "big !"
 | x < 1 = "small !"
f 3 = "3"
f 2 = "2"
f 1 = "1"
f :: Int -> String
f x 
 | double x >= 100 = "big !"
 | double x < 100 = "small !"
 where
  double x = x * x 
sum' :: Num a => [a] -> a
sum' [] = 0
sum' (h:t) = h + sum t

let式

let f x = x * x in f 2
[ x | (y,z) <- zip ["1","2","3"] ["a","b","c"] , let x = y ++ z ]

カリー化関数、ラムダ式高階関数

map (+1) [1..10]
map (\x -> x + 1) [1..10]

関数合成

let f x = x * x
let g x = x + 1
(f . g) 10

補足:コンパイル時の警告も表示するには

ソースファイルの冒頭に以下を記述すればOK。例えば、パターンマッチが網羅的でない場合などにGHCに怒ってもらえる。

{-# OPTIONS -Wall #-}

警告の場合でもコンパイルエラーにしたい場合は下記の記述に。

{-# OPTIONS -Wall -Werror #-}

参考文献

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!