首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell教堂数字无法打印|应为类型,但T具有种类`f`

Haskell教堂数字无法打印|应为类型,但T具有种类`f`
EN

Stack Overflow用户
提问于 2021-07-02 18:57:32
回答 1查看 66关注 0票数 0

我正在关注维基百科上关于如何处理教会字面的指南。根据每篇文章,有一个Haskell代码片段:

链接到维基Here

代码语言:javascript
复制
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运行它时,我得到了以下错误:

代码语言:javascript
复制
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,而且

代码语言:javascript
复制
instance Show Church Integer where
    show = church

不幸的是,两者都产生了更多的错误。我不确定Church Integer在函数声明中是什么意思,或者这是不是我无法派生show的原因?

如何打印此函数?

EN

回答 1

Stack Overflow用户

发布于 2021-07-02 19:31:27

惯用的方式是将它定义为一个新类型,a也应该是通用的量化

代码语言:javascript
复制
>> church 10
10
代码语言:javascript
复制
{-# 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 . unchurch
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68223995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档