如何解决在Haskell中调用函数-初学者问题
| 刚开始学习Haskell。 我里面有一个空的源文件:pe :: (Integral a) => a -> a
pe y = sum [x | x <- [1..y-1],x `mod` 3 == 0 || x `mod` 5 == 0]
现在,如果我这样做,我可以这样叫pe:
*Main> pe 1000
233168
如何从源文件中调用它?如果我有
pe 1000
它返回一个神秘的错误:
GHC stage restriction: `pe\'
is used in a top-level splice or annotation,and must be imported,not defined locally
In the expression: pe 1000
我需要在main或其他内容中声明它吗?
解决方法
是的,您需要将其连接到
main
函数。例如,
main = print (pe 1000)
如果要打多个电话,可以将它们与do
表示法组合:
main = do
print (pe 500)
print (pe 1000)
, Haskell源文件包含一系列定义,而不是表达式。因此,您不能只将表达式放在文件的顶层,而必须将其放在定义的主体内。因此,由于pe 1000
不是定义,因此会出现错误。
但是,为什么这样一个隐秘的错误消息呢? GHC具有名为Template Haskell的扩展,该扩展使您可以在编译时以编程方式创建定义。为此,您可以将表达式放置在通常只允许使用定义的地方,并在编译时对表达式求值,然后将表达式替换为其结果(必须是定义)-这称为剪接,然后该表达式称为接头。这样的接头需要满足两个要求:
表达式中使用的任何标识符都必须在不同的源文件中定义(这是必需的,以便在遇到表达式时已经编译了使用的函数,因此可以在编译时进行调用)
表达式的类型必须是代表有效定义的Template Haskell类型。
因此,由于表达式“ 8”出现在仅允许定义的位置,因此GHC认为它是一个拼接体。但是,由于它不符合上述第一个条件,即它是在当前文件中定义的,而不是在其他文件中定义的,因此GHC对此表示抱怨。当然它也不满足第二个条件,但是GHC在产生错误消息时还没有达到第二个条件。如果在不同的源文件中定义了“ 10”,那么您将收到一条错误消息,抱怨“ 10”的类型错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。