Haskell无效类型签名

Haskell无效类型签名,haskell,ghc,ghci,Haskell,Ghc,Ghci,快速提问,这有什么问题 (get) :: [a] -> Int -> a -- <- line 21 (x:xs) get 0 = x (x:xs) get (n+1) = xs get n 我正在尝试使用get中缀运算符。首先,在get周围不应该有括号。不过,整个定义的语法看起来有点不对劲。我猜你想要这样的东西: get :: [a] -> Int -> a get (x:xs) 0 = x get (x:xs) (n+1) = xs `get` n 请注

快速提问,这有什么问题

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

我正在尝试使用get中缀运算符。

首先,在
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)

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

我正在工作。检查源代码中的&。@Kevin:运算符就是这样工作的,即由符号组成的标识符。字母数字标识符的语法不同。不仅不推荐:它在股票GHC中不再起作用(在Haskell 2010中也不再起作用)。@ehird:“不再起作用”只是攻击性不推荐的转移点。:]@ehird已经在HEAD中进行了更新,似乎忘记了将更改合并到7.2分支中。
(x:xs) `get` n = xs `get` (n - 1)