nashcft's blog

時々何か書く。

#builderscon メモ: Haskellを使おう (Track B 14:30~15:30)

builderscon.io

speakerdeck.com

スライド見つつメモ読み返すとどこでついていけなくなったかがよくわかる 😇
最初は調べてメモの内容を充実させてから投稿しようと思ったけど現実的な時間でできそうにないしスライド読もうねという感想なので投げました

モナド周りは5月のJJUGで発表された↓のスライドがわかりやすかった記憶があるので読み直して勉強し直します…

www.slideshare.net

agenda

  • 話すこと
    • stack/ecosystem
    • 実行制御
    • IO処理
    • 外部パッケージの利用
  • 話さないこと
    • Haskellの抽象的なあれこれ

Stack

  • cabal-installに代わるbuildtool
  • 依存パッケージのローカライズ
    • cabalは全部globalな管理してたくさい
  • 最速でREPL
    • curlでインストール -> stack setup -> stack ghci
  • Stackage
    • package一覧
    • Hoogle (関数名/型名/型定義 (::型名) で検索)
    • doc (モジュール一覧、依存・非依存package)
  • buildポイント
    • ghc-options: -WALL @ *.cabal
      • 全警告表示
    • hlint
    • ghc-options: -threaded @ *.cabal
    • hpack
    • ghc 8.2.1
      • error表示がcolored

Haskellのコミュニティ

書籍が出る

実行制御

  • 順次処理: 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記法にかけるもの
        • 操作に引数を適用した、Monad m => m a型を持つ式
        • 一つのdoブロックには1つのモナド操作しか書けない
        • 並べた操作がどう実行されるかはモナドによる
          • IOでは並べられた順に
      • do記法のコツ
        • 変数定義
          • let x = ... vs x <- ...
            • <-は操作を実行した結果を取り出して束縛
              • 操作を直接引数にできないので必ず <- で束縛してから使う
            • letは右辺をそのまま束縛

アプリケーションと状態

  • 状態の受け渡し
    • State, Reader
    • doブロックに書けるモナド操作は一つだけ
      • ウッ
  • モナド変換子
    • モナド m に操作を追加する
    • モナド m の操作は lift を経由して使う
    • runHogehogeT という命名でモナド m に戻す関数が存在
    • StateTモナド変換子
    • ReaderTモナド変換子
      • 読み込みだけでなく状態を表現できる
  • FWに現れるMonadIO

パッケージの選び方

  • Stackageの自分が使うLTSから選ぶ
    • Cのライブラリへの依存でハマることが多い (特にWindows)
    • ドキュメントをよく読んでおこう