@start_haskell
初心者の敷居を下げる
URL:http://atnd.org/events/29448
・(0章) イントロダクション
http://www.slideshare.net/YasuyukiOgawa/ss-13433189
・スタートHaskellって?
http://www.slideshare.net/YasuyukiOgawa/haskell-13433200
・2章「型を信じろ」
http://www.slideshare.net/skoji/haskell2-13424552
HaskellはPure
変数はない? 最大代入できない
バイナリをなるべく使おう
STOPと公式にある
7.4.2が最新
Platform7.4.1が最新
他の処理系は無視していい
!=ではなく/=
True, Falseは大文字
> :t succ succ :: Enum a => a -> a
> 1 == True False
- は特殊
→マイナスか引き算かは曖昧
:t negate
ghci> ['z','v'..'a']
"zvrnjfb"
let aList = [1..20] take 2 (tail aList) ++ [last(init aList)] take 2 (tail aList) ++ last (init aList) :[] 1:2:3:4:5:[] head 1..10:[] take 10 [x | x <- [1..], y <- [1..10], x `mod` y == 0]
・動くけど遅い
head [x|x <- [1,2..],x `mod` 1 == 0 && x `mod` 2 == 0 && x `mod` 3 == 0 && x `mod` 4 == 0 && x `mod` 5 == 0 && x `mod` 6 == 0 && x `mod` 7 == 0 && x `mod` 8 == 0 && x `mod` 9 == 0 && x `mod` 10 == 0] 2520
head [(a,b,c)|c<-[1..998], b<-[1..c],a<-[1..b],a^2 + b^2==c^2, a+b+c == 1000]
リスト内包表記は軽い条件を先に書こう
head [(a,b,c) | a<-[1..998], b<-[a..999],a<-[1..b], let c=1000-a-b,a^2 + b^2==c^2]
まだ習ってないモナドのlet
これも
[(a,b,(1000-a-b)) | a<-[1..998], b<-[a..998], a^2 + b^2 == (1000-a-b)^2]
型宣言は良い習慣
Int
Intefer 誘拐じゃない
1.0はFlactional(Int ot Float)
Int*IntはOK
Int*Integerじゃエラー
型安全
型変換するときは必ず書かないといけない
- は組み込み
暗黙の型変換
リテラルと数字は違う
2+2.5
Intから型変換は起こってない
2はIntなのは錯覚
2 -> Num型クラスのなにか
まず2はNumと判断され+が適用されて後の2.5に引きづられて2はFloatと判断されるのか
どんだけ型を厳しくするかがHaskellの素晴らしさ
Numは型クラス
C#のみたいにリフレクションはない
ダイナミックローディングは「基本的にはない」。
[1..10]: !! 0
[[1,2,3,4,5,6,7,8,9,10]*** Exception: Prelude.(!!): index too large
↓こうする
ghci> ([1..10]:) !! 0
優先順位が:より!!が強いため、()を使う。
・読み方
ghci> :t 2
2 :: Num a => a
「 =>」n左側は、制約の型 Num
aが実際の型クラス
ghci> :t "2" "2" :: [Char]
演習
http://wiki.haskell.jp/Workshop/StartHaskell/LYHGG/exercise/2
・Haskelでテスト
http://www.slideshare.net/ShokoSasaki/haskell-13433770
・HUnit
cabal install HUnit
https://github.com/shokos/Haskell_test_tut
・48時間でお覚えられる
http://ja.wikibooks.org/wiki/48%E6%99%82%E9%96%93%E3%81%A7Scheme%E3%82%92%E6%9B%B8%E3%81%93%E3%81%86