Haskell无效类型签名

时间:2011-12-30 05:25:58

标签: haskell ghc ghci

快速提问,这有什么问题?

(get) :: [a] -> Int -> a   -- <- line 21
(x:xs) get 0 = x
(x:xs) get (n+1) = xs get n
当我尝试加载包含该代码的文件时,

ghci会出现此错误。

Prelude> :load ch6.hs 
[1 of 1] Compiling Main             ( ch6.hs, interpreted )

ch6.hs:21:0: Invalid type signature
Failed, modules loaded: none.

我正在尝试获取一个中缀运算符。

2 个答案:

答案 0 :(得分:12)

首先,get周围不应有括号。但是,整个定义的语法看起来有点过时了。我猜你想要这样的东西:

get :: [a] -> Int -> a
get (x:xs) 0 = x
get (x:xs) (n+1) = xs `get` n

请注意get周围的反引号,以便使用它作为中缀,这是必要的,因为字母数字标识符的规则与运算符不同:运算符由符号组成,默认为中缀,写入他们没有参数或使用它们前缀,你把它们放在括号中。默认情况下,字母数字标识符是前缀,并且使用反引号将它们包围起来,可以使用它们作为中缀。

如果你愿意的话,你也可以在左侧使用反手,但这看起来有些奇怪:

(x:xs) `get` 0 = x
(x:xs) `get` (n+1) = xs `get` n

顺便提一下,不推荐使用模式语法n+1,因此您可能不应该使用它。相反,这样做:

(x:xs) `get` n = xs `get` (n - 1)

答案 1 :(得分:2)

仅仅因为你把它放在括号中并不会使它成为中缀函数。中缀功能只能通过符号或反引号来实现。有关详细信息,请参阅Haskell report