理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

Haskell に入門しました

仲間うちでこの本で読書会しましょうという話がありました。

プログラミングHaskell

プログラミングHaskell

一ヶ月くらい前にあったわりには読書会の話は進んでなくて、じゃー読書会までは待機モードかなってかわいく思いつつ情報収集してたら、どうやら各自が勝手に勉強しているという抜け駆けに近い状況らしい。
「kiririmode はかなり先に進んでるだろうって話してた」というような話も漏れ聞こえ、ヤバい 1 ページも読んでねーぞっていうぼくは懸命に Haskell に入門することにしたのでした。

言語全体については、型推論はもちろん、文法含めて ML に非常に良く似ているなっていう印象を受けました。というよりは、年代を考えると ML の子孫に Haskell があるんだと思います。

4 章までさらっと読んで、練習問題をやってみた。

練習問題

下記の問題文は本文とはずいぶん違います。

1. 偶数の長さを持つリストを半分ずつに分割する関数 halve を定義せよ。

halve :: [a] -> ([a], [a])
halve xs = ( take (length xs `div` 2) xs, drop (length xs `div` 2) xs)

2. ライブラリ関数 tail のように振る舞い、空リストに関しては空リストを返す safetail を以下を用いて定義せよ
a. 条件式
b. ガードつきの等式
c. パターンマッチ

safetailA :: [a] -> [a]
safetailA xs = if null xs then []
                          else tail xs     
                               
safetailB :: [a] -> [a]
safetailB xs | null xs = [] 
             | otherwise = tail xs
               
safetailC :: [a] -> [a]
safetailC [] = []
safetailC xs = tail xs

3. パターンマッチを用いて論理和演算子 || を定義せよ

(||) :: Bool -> Bool -> Bool
False || False = False
_ || _ = True

4. 条件式を用いて論理積演算子 && を定義せよ

(&&) :: Bool -> Bool -> Bool
(&&) a b = if a then 
             if b then True
             else False
           else False

6. カリー化された関数 mult x y z = x * y * z をλ式を用いて表現せよ

mult :: (Num a) => a -> a -> a -> a
mult = \x -> (\y -> (\z -> x * y * z))