这里的问题是,默认情况下,不可能在 Haskell 中打印值。打印内容的默认方式——由print
功能和 GHCi REPL 等 - 是show
函数,由类型类定义Show
.
那么,您收到的错误是通知您已经计算了没有实例的类型的表达式Show
定义的。模数一些措辞,这就是所有错误消息所说的:
No instance for (Show ((t -> t1) -> t -> t1))
方式((t -> t1) -> t -> t1)
是为您评估的表达式推断出的内容。这是 Church 数字 1 的有效类型,尽管 Church 数字的“正确”类型实际上应该是(a -> a) -> a -> a
.
arising from a use of `print' at <interactive>:1:0-1
它隐式地使用print
函数来显示值。通常这会告诉您在程序中的哪个位置发现了错误,但在这种情况下它说<interactive>:1:0-1
因为错误是由 REPL 中的表达式引起的。
Possible fix:
add an instance declaration for (Show ((t -> t1) -> t -> t1))
这只是建议您可以通过定义所需的实例来修复错误。
现在,您可能想要实际打印您的教堂数字,而不仅仅是知道为什么不能。不幸的是,这并不像添加它所要求的实例那么简单:如果您为(a -> a) -> a -> a
,Haskell 将此解释为一个实例任何具体的a
,而丘奇数字的正确解释是一个多态函数,适用于任意任意a
.
换句话说,你想要你的show
函数是这样的:
showChurch n = show $ n (+1) 0
如果你真的愿意,你可以像这样实现 Show 实例:
instance (Show a, Num a) => Show ((a -> a) -> a -> a) where
show n = show $ n (+1) 0
and add {-#LANGUAGE FlexibleInstances#-}
到文件的第一行。或者您可以实现类似的方法将它们转换为常规数字
> churchToInt c1
1
> showChurch c1
"1"
etc.