我正在关注维基百科上关于如何处理教会字面的指南。根据每篇文章,有一个Haskell代码片段:
链接到维基Here
type Church a = (a -> a) -> a -> a
church :: Integer -> Church Integer
church 0 = \f -> \x -> x
church n = \f -> \x -> f (church (n-1) f x)
unchurch :: Church Integer -> Integer
unchurch cn = cn (+ 1) 0然而,当我尝试通过GHCI运行它时,我得到了以下错误:
main.hs:3:15: error:
* Expecting one more argument to `Church'
Expected a type, but `Church' has kind `* -> *'
* In the first argument of `Show', namely `Church'
In the instance declaration for `Show Church'
|
3 | instance Show Church where我试着在类型上使用deriving show,而且
instance Show Church Integer where
show = church不幸的是,两者都产生了更多的错误。我不确定Church Integer在函数声明中是什么意思,或者这是不是我无法派生show的原因?
如何打印此函数?
发布于 2021-07-02 19:31:27
惯用的方式是将它定义为一个新类型,a也应该是通用的量化
>> church 10
10{-# Language GADTs #-}
{-# Language InstanceSigs #-}
{-# Language RankNTypes #-}
{-# Language ScopedTypeVariables #-}
{-# Language StandaloneKindSignatures #-}
{-# Language TypeApplications #-}
import Data.Kind
type Church :: Type
newtype Church where
Church :: (forall a. (a -> a) -> (a -> a)) -> Church
church :: Integer -> Church
church n = Church (ch n) where
ch :: Integer -> forall a. (a -> a) -> (a -> a)
ch 0 succ zero = zero
ch n succ zero = succ (ch (n-1) succ zero)
unchurch :: Church -> Integer
unchurch (Church church) = church @Integer (+ 1) 0
instance Show Church where
show :: Church -> String
show = show . unchurchhttps://stackoverflow.com/questions/68223995
复制相似问题