kdnakt blog

hello there.

会社でHaskell dojoがはじまった

第1回です。教材はこちら。

walk.northcol.org

[第1回の様子]

2023/09/06に第1回を開催した。

参加者は自分を入れて16人。初回だからか、どこからか開催の噂を聞きつけたメンバーが集まったらしい。Rust dojoの時もそういえば最初は16人いた。最終的にRust dojoは5人前後に落ち着いて終わったけど、Haskell dojoは何人残るかな...。

kdnakt.hatenablog.com

ちなみにRust dojoの初回と今回の記事のタイトルが微妙に違うのは、会の主催が自分ではないから。Rust dojoに参加してくれていたHaskell好きの同僚が勉強会の枠を引き取って、Haskell dojoを開催してくれている。

Haskellそのものはここ10年ほどアップデートがないらしく、2015年に書かれたウォークスルーHaskellというサイトで学んでいくことに。

walk.northcol.org

ローカル環境は用意せず、必要に応じてプレイグラウンド上でコードを動かしていく。

play.haskell.org

[学んだこと]

  • 今週はHaskell についてを学んだ
  • 1. Haskell とは
    • 純粋関数型言語。1990年。
    • 当時乱立していた遅延評価型関数言語を統一したくて登場。
      • OCamlとかは遅延評価じゃない
  • 2. Haskell の特徴
  • 2.1. 純粋関数型言語
    • 関数:同じ引数にいつも同じ値を返す(参照透過性)。
    • 純粋=参照透過性+副作用なし
    • リストを2乗する処理
      • map (\x -> x * x) [1, 2, 3, 4, 5]
  • 2.2. モナド
    • 入出力などの副作用を実現するためにモナドがある
      • 初期Haskellでは遅延リストの仕組みを利用した
    • flatmapとsingletonがあればモナドと言っていい
    • 名前を入力として受け取って出力するコードはこんなかんじ
main = do
    putStr "あなたの名前: "
    name <- getLine
    let greeting = "こんにちは," ++ name ++ "さん."
    putStrLn greeting
  • 2.3. 強力な型システム
    • 強い静的型付けの型システム
    • 型推論機構も強力
    • append x y = x ++ yだけで型推論して2つのリストを連結する
      • 推論結果はこうなる:append :: [a] -> [a] -> [a]
    • ここで小文字で書かれてるaはジェネリック
      • Haskellの型は通常大文字始まりで表す
    • appendを動かしてみるとこんな感じ
append :: [a] -> [a] -> [a]
append x y = x ++ y

main :: IO ()
main = print $ append "Hello" "World"

// HelloWorldと出力される
    • スペースを入れたい場合こんな感じ
append :: [a] -> [a] -> [a]
append x y = x ++ y

main :: IO ()
main = print $ append (append "Hello" " ") "World"

// Hello Worldと出力される
  • 2.4. 型クラス
    • データ型をカテゴライズする役割を持つ
    • Javaでいうインターフェース的な感じ
    • Num型クラスがあって、Int、Double、Floatなどのデータ型が属する
  • 2.5. 遅延評価
    • 式の評価はできるだけ先延ばしにする
    • 評価する必要のない式は評価しない
    • 計算の効率化+無限長のデータ
      • take 5 [1..]で無限長のリストに関数を適用し、先頭5要素を取り出す
      • print [1..]とかやってしまうと無限長リストを出力しようとしてハングする
  • 3. Haskell の仕様
    • 1990年にHaskell 1.0
    • 2009年にHaskell 2010
    • 2016年にHaskell 2020の準備が始まったがまだできてない
  • 4. Haskell の実装
    • いくつも実装があるがGHC(Grasgow Haskell Compiler)がデファクト
    • パッケージ管理は色々ある
    • 最近の記事だとこの辺が参考になる

zenn.dev

zenn.dev

  • 5. 関連サイト
    • やさしい、とか、gentleとかは殺しにくるので注意、とのこと。
  • 第2章は開発環境についてなので、今回はスキップ。
    • 上で引用した記事を参照のこと。

[まとめ]

とりあえずモナドが大事そうなのはわかった。