HaskellでChurch numeralを実装しようと、
以下のような関数を定義しました。
lang
1true x y = x 2false x y = y 3_if b x y = b x y 4zero f x = x 5one f x = f x 6s n f x = f (n f x) 7isZero n = n (\x->false) true 8add m n f x = m f (n f x) 9mult m n f = m (n f) 10toInt n = n (+1) 0 11toChurch 0 = zero 12toChurch n = s (toChurch (n-1)) 13pre n f x = (n (\g h->h(g f)) (\u->x)) (\u->u)
toInt(add (toChurch 3) (toChurch 8))などは、きちんと11になります。preの定義はWikipediaから引っ張ってきました。
ところが、上の関数をSample.hsに書いて、ghciで読み込んだ後、次の単純な関数を定義しようとすると、エラーになります。直感的には、nが0なら1を、0以外ならそのまま返すだけの単純な関数なのですが…。
lang
1let hoge n = _if (isZero n) one n
下記のエラーが出るのですが、型がうまく取れていなさそうだということしかわかりません。どうすればよいのでしょうか。
それとも、Haskellでは型の制限でChurch numeralを実装するのは不可能でしょうか。
Occurs check: cannot construct the infinite type:
t2
~
(t1 -> t3 -> t4 -> t4)
-> (t6 -> t5 -> t6) -> ((t8 -> t7) -> t8 -> t7) -> t2 -> t
Relevant bindings include
n :: (t1 -> t3 -> t4 -> t4)
-> (t6 -> t5 -> t6) -> ((t8 -> t7) -> t8 -> t7) -> t2 -> t
(bound at <interactive>:2:10)
hoge :: ((t1 -> t3 -> t4 -> t4)
-> (t6 -> t5 -> t6) -> ((t8 -> t7) -> t8 -> t7) -> t2 -> t)
-> t
(bound at <interactive>:2:5)
In the third argument of ‘_if’, namely ‘n’
In the expression: _if (isZero n) one n
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。