「ふつうのHaskellプログラミング」読了

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門

以下適当めも

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 ()ってなんぞ?