Idris勉強会
#Seminar #Idris
11/8(Wed) @BizReach (渋谷クロスタワー)
https://d-cube.connpass.com/event/70758/
依存型
シグネチャだけで、よくあるエラーケース・コーナーケースを弾けて嬉しい
引数として受け取れたなら、必ず計算できる関数を書ける
code:tail.idr
tail : Vect (S n) a -> Vect n a
tail x :: xs = xs
S nはOにマッチしないので非空リストを要求できる。
tailやheadでも、Maybeでくるむ必要のないシロモノを書ける
下の方に書いてあるが、
code:zip.idr
zip : Vect n a -> Vect n b -> Vect n (a, b)
zip [] [] = []
zip (x :: xs) (y :: ys) = (x, y) :: zip xs ys
長さの同じリストだけを要求できる
バリデーションは呼び出し側に強制できる
関数のシグネチャを満たすような値でなければ渡せない。コンパイルが通らない
バリデーションがダブることもない
ドキュメントも必要最小限で済む。
「同じ型の値の中でも例外があるケース」を別途記述しなくていい
同値型
2つのNatが同値であることを型レベルで表現するテクニック(EqNat)を使って、zipが常に成功するようなバリデーションをする例
長いので略。そのうち資料公開されることを祈る
された => https://gitpitch.com/y-oda/slide_idris_2017_11/master?grs=github&t=night
http://docs.idris-lang.org/en/latest/tutorial/theorems.html
Idris所感
遅い。ゲロ遅い。コンパイルも実行も遅いので実用的ではない
2014年のIdrisでWebアプリを書く時代から解決してない問題点も多い模様
LTE Nat Natによるチェックが失敗するので100 - 100ができないとかいう罠
The constructors of the required type. If they have arguments, it will search recursively up to a maximum depth of 100.
その他面白いが色々罠はある
取り敢えず下記リンクが導入にいい
https://www.manning.com/books/type-driven-development-with-idris
http://docs.idris-lang.org/en/latest/tutorial/