文法の基礎(4)

  • 入力が7なら1を返し、それ以外なら0を返す関数を作る(hs0129.hsというファイルで保存)
sevenorothers :: (Integral a) => a -> a
sevenorothers 7 = 0
sevenorothers x = 1
  • これをロードして
ghci> :l hs0129.hs
[1 of 1] Compiling Main             ( hs0129.hs, interpreted )
Ok, modules loaded: Main.
ghci> sevenorothers 7
0
ghci> sevenorothers 8
1
ghci> :t sevenorothers
sevenorothers :: Integral a => a -> a
ghci> :t sevenorothers 7
sevenorothers 7 :: Integral a => a
  • ついでにこの関数のタイプを調べたり、「この関数に引数を与えた状態」のタイプを調べたりしてみる。ハスケルでは、関数も、関数に引数がわたった状態もどちらも、区別なく扱えるので、もちろん、両者にタイプがある。ただし、引数を渡された状態は、もう、「値」しか持っていないので、Integral タイプクラスであるところのaがあったときに、そのa自体をタイプとして持つ、というように返ってくる
  • フィボナッチ数列ならこうなる。初期値と漸化式ルールをそのまま関数として定義したものなので、ループが馬鹿みたいに深くなるが
fib:: (Integral a) => a -> a
fib 0 = 0
fib 1 = 1
fib x = (fib (x-1)) + (fib (x-2))
ghci> :l hs0129.hs
[1 of 1] Compiling Main             ( hs0129.hs, interpreted )
Ok, modules loaded: Main.
ghci> fib 2
1
ghci> fib 3
2
ghci> fib 4
3
ghci> fib 5
5
ghci> fib 6
8
  • リストの要素を一つずつ取り出して行う処理もハスケルらしいので覚える
mysum:: (Num a) => [a] -> a
mysum [] = 0
mysum (x:xs) = x + mysum xs
Prelude> :l hs0129.hs
[1 of 1] Compiling Main             ( hs0129.hs, interpreted )
Ok, modules loaded: Main.
*Main> mysum []
0
*Main> mysum [1]
1
*Main> mysum [1..5]
15
  • guards っていうのは、if else if ... elseみたいなもの
myselection:: (RealFloat a) => a -> a -> a
myselection x y
	| x > y = 1
	| x < y = -1
	| otherwise = 0
*Main> myselection (0.5*2) 1.0
0.0
*Main> myselection (0.5*2) 1
0.0
*Main> myselection (0.5*2) 1.1
-1.0