標高+1m

Don't be rational

Carrotに別名を導入した

f:id:ympbyc:20140109164304p:plain

昨日の記事で、

例えば、真偽値はa -> a -> aな関数にして、型はBoolにしたいけど、 そうしちゃうと=cを使っても分岐の左右が同じ型かのチェックができなくなっちゃう

ということを書いたんだけど、とりあえずこのBoolについての問題はシノニムを導入する事で一応解決した。シノニムはHaskelltypeに相当するもので、型の別名を登録できる。シノニムの情報はリードタイムに使われて、別名を見つけたら本名を引いてきて別名を置き換える。

(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)))みたいに複雑なのはまだできないです。