Carrotに別名を導入した
昨日の記事で、
例えば、真偽値は
a -> a -> a
な関数にして、型はBool
にしたいけど、 そうしちゃうと=c
を使っても分岐の左右が同じ型かのチェックができなくなっちゃう
ということを書いたんだけど、とりあえずこのBoolについての問題はシノニムを導入する事で一応解決した。シノニムはHaskellのtype
に相当するもので、型の別名を登録できる。シノニムの情報はリードタイムに使われて、別名を見つけたら本名を引いてきて別名を置き換える。
(synonym Bool (Fn a a a)) (= (true Bool) x y x) (= (false Bool) x y x) (=c (foo Bool String) b (b "ok" :nok)) ;;分岐の左右の型が違う (foo true) ;;~> Primitive type contradiction: String -><- Keyword
これで問題が解決するという事を確かめるためにちろっと書いただけで、パターンマッチを噛ませていないので(synonym (AList a b) (List (Pair a b)))
みたいに複雑なのはまだできないです。