快速提问,这有什么问题?
(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.
我正在尝试获取一个中缀运算符。
答案 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。