スライド見つつメモ読み返すとどこでついていけなくなったかがよくわかる 😇
最初は調べてメモの内容を充実させてから投稿しようと思ったけど現実的な時間でできそうにないしスライド読もうねという感想なので投げました
モナド周りは5月のJJUGで発表された↓のスライドがわかりやすかった記憶があるので読み直して勉強し直します…
www.slideshare.net
agenda
- 話すこと
- stack/ecosystem
- 実行制御
- IO処理
- 外部パッケージの利用
- 話さないこと
- Haskellの抽象的なあれこれ
Stack
- cabal-installに代わるbuildtool
- 依存パッケージのローカライズ
- cabalは全部globalな管理してたくさい
- 最速でREPL
- curlでインストール ->
stack setup
->stack ghci
- curlでインストール ->
- Stackage
- package一覧
- Hoogle (関数名/型名/型定義 (
::型名
) で検索) - doc (モジュール一覧、依存・非依存package)
- buildポイント
ghc-options: -WALL
@*.cabal
- 全警告表示
hlint
ghc-options: -threaded
@*.cabal
hpack
- ghc 8.2.1
- error表示がcolored
Haskellのコミュニティ
書籍が出る
- “Haskell入門 - 関数型プログラミング言語の基礎と実践”
- @ruicc, @its_out_of_tuneと共著
- 9/27 (予定)
実行制御
- 順次処理:
do
- 操作を並べて書く
- 分岐:
case
など - 繰り返し: リスト、Freeモナドなど再帰データ型を介した繰り返しは得意
map
,foldr
,mapM_
- continue は
filter
で - break は
takeWhile
で - 手続き的なループは…
- 再帰で同様な振る舞いを記述できる (
loop
を用いる) - Streamingライブラリを用いる (e.g.
conduit
)
- 再帰で同様な振る舞いを記述できる (
I/O処理
- 書けるけどそれほど得意でもない
- appにおいてはほとんどの場合I/Oが主役
- I/O処理ができないと利用価値が…
- 利用価値のあるappを作りましょう
- I/Oのノウハウを会得しよう
- I/Oが可能な場所
- IOモナドの中
- e.g. main関数
- IOをモナド変換子でラップしたモナドの中
- a -> b -> … -> OtherMonadT Hoge (SomeMonad Foo Bar IO) z みたいな
- lift
- MonadIO型クラス
- MonadIO m => a -> b -> … -> m z みたいな
- liftIO
- IOモナド
- 入出力、mutable変数、例外やcatch
- IOモナドがないとこれらの機能を利用できない
- State, Errorなどのモナドはあくまで模倣
- 書きやすいかというと…
>>=
はcallbackを要求: callback hell…- doで隠す
- モナド状の操作
- 操作: 戻り値の型が Monad m => m a の形式のもの
- putStrLn :: String -> IO ()
- とか
- 操作でないもの
- unsafePerformIO :: IO a -> a
- runState :: State s a -> s (a, s)
- do記法にかけるもの
- do記法のコツ
- 変数定義
let x = ...
vsx <- ...
- <-は操作を実行した結果を取り出して束縛
- 操作を直接引数にできないので必ず <- で束縛してから使う
- letは右辺をそのまま束縛
- <-は操作を実行した結果を取り出して束縛
- 変数定義
- 操作: 戻り値の型が Monad m => m a の形式のもの
- IOモナドの中
アプリケーションと状態
パッケージの選び方
- Stackageの自分が使うLTSから選ぶ
- Cのライブラリへの依存でハマることが多い (特にWindows)
- ドキュメントをよく読んでおこう