我找不到一種方法來將增加定義爲重複增量,儘管這可能是一種無類型的語言。這裏是我的代碼:是否可以使用迭代增量在鍵入的教會數字上實現加法?
{-# LANGUAGE RankNTypes #-}
type Church = forall a . (a -> a) -> (a -> a)
zero :: Church
zero = \f -> id
inc :: Church -> Church
inc n = \f -> f . n f
-- This version of addition works
add1 :: Church -> Church -> Church
add1 n m = \f -> n f . m f
-- This version gives me a compilation error
add2 :: Church -> Church -> Church
add2 n m = n inc m
編譯錯誤我得到add2
是
Couldn't match type `forall a1. (a1 -> a1) -> a1 -> a1'
with `(a -> a) -> a -> a'
Expected type: ((a -> a) -> a -> a) -> (a -> a) -> a -> a
Actual type: Church -> (a -> a) -> a -> a
In the first argument of `n', namely `inc'
In the expression: n inc m
In an equation for `add2': add2 n m = n inc m
爲什麼這是一個錯誤? Church
是不是((a->a) -> a -> a)
的同義詞?
您可能還喜歡[this recent question](http://stackoverflow.com/q/23532659/791604)。 –
對於實際使用,我推薦'newtype'而不是類型同義詞。 – PyRulez