「ふつうのHaskellプログラミング」読了
ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門
- 作者: 青木峰郎,山下伸夫
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2006/06/01
- メディア: 単行本
- 購入: 25人 クリック: 314回
- この商品を含むブログ (320件) を見る
以下適当めも
4章
文字列を行単位で処理する場合のイディオム
unlines $ hoge $ lines cs
練習問題解答例がこの段階では不適切かなと(関数合成とか)
import List main = do cs <- getContents putStr $ unlines $ map sort $ lines cs
import List main = do cs <- getContents putStr $ unlines $ map head $ group $ lines cs
7章
パターンマッチ
ワイルドカードパターン
head関数やtail関数は以下のようにも定義できる
head (x:_) = x tail (_:xs) = xs
as-pattern
lstrip str@(c:cs) = if isSpace c then lstrip cs else str
let式,where節
- let式は単純に新しい変数を導入する為に式の中でだけ有効な束縛を導入する
- where節は関数内で使用する為の関数を定義する
shadowing
同じ名前の変数をlet式で導入するとlet式内ではlet式で導入した方が参照される
f x y = let y = x * x in y - 1
練習問題解答
len = 60 main = do cs <- getContents putStr $ unlines $ map fold $ lines cs fold :: String -> String fold "" = "" --空の文字''は存在しない fold cs = let x = splitAt len cs in if (length $ snd x) > len then (fst x) ++ "\n" ++ (fold $ snd x) else (fst x) ++ if (length $ snd x) == 0 then "" else "\n" ++ snd x
8章
無名関数
-- \を使うのはλに似てるから \x y -> x + y --無名関数+高階関数 map (\n -> n * n) [1, 2, 3, 4, 5]
関数合成
--引数をgしてfする関数 f . g
部分適用
Haskellには2つ以上引数を取る関数はない(全て部分適用)
addThree :: Int -> Int -> Int -> Int addThree i j k = i + j + k -- \j k -> 5 + j + kと同じ addThree 5
11章
- alist(association list)
- 2要素タプルのリスト
IOモナドと(>>)
--以下3つは同じ do putStrLn "Hello, World!" outStrLn "Hello, again!!!" putStrLn "Hello, World!" >>= (\x -> putStrLn "Hello, again!!!") putStrLn "Hello, World!" >> putStrLn "Hello, again!!!"
let節
do let n = 2 * 16 print n
練習問題
main :: IO ()ってなんぞ?