Haskell Forall错误非法符号
我的程序中出现了以下错误:Haskell Forall错误非法符号,haskell,Haskell,我的程序中出现了以下错误: Illegal symbol '.' in type Perhaps you intended to use RankNTypes or a similar language extension to enable explicit-forall syntax: forall <tvs>. <type> 标准Haskell不支持您尝试使用的所有语法。为了使用它,您需要启用语言扩展,例如RankNTypes。有几种方法可以启用这
Illegal symbol '.' in type
Perhaps you intended to use RankNTypes or a similar language
extension to enable explicit-forall syntax: forall <tvs>. <type>
标准Haskell不支持您尝试使用的所有语法。为了使用它,您需要启用语言扩展,例如
RankNTypes
。有几种方法可以启用这些扩展,但最简单的方法是在源文件顶部添加一行,如下所示:
{-# LANGUAGE RankNTypes #-}
在GHCi中,在交互式提示下,您可以执行以下操作:
> set -XRankNTypes
但是,在这种情况下,我不知道您为什么会这样写:
complementar :: forall a. Eq a => Int -> [a] -> [a]
因为这相当于写作:
complementar :: Eq a => Int -> [a] -> [a]
这是标准的Haskell语法,不需要任何扩展
程序的另一个问题是检查x
是否为偶数(即(x/2)==divx2
表达式)在Haskell中不起作用。除法运算符“/
”不能处理整数,因此必须先将x
转换为浮点
这在这种情况下是可行的,但一般来说,基于浮点数相等的测试比较棘手,最好避免。检查一个整数是否可被另一个整数整除的更标准的方法是查看整数整除后的余数是否为零,您可以使用rem
函数:
> 10 `rem` 2 == 0
True
> 7 `rem` 2 == 0
False
>
(如果必须处理负数,可能需要研究rem
和mod
之间的区别。)
在这种情况下,您可以使用一个库函数:
> even 10
True
> even 7
False
>
你试过按照建议做吗?:)将
{-#LANGUAGE RankNTypes#-}
添加到文件的顶部。对于这种特定情况,您只需删除即可获得所有a代码>。启用ScopedTypeVariables
也有效。(不过还有其他错误,比如在Int
上使用/2
)
> even 10
True
> even 7
False
>