Haskell,即使我的类型未指定,我也会收到此错误:无法将类型"a"与"[a]"匹配,"a"是绑定的刚性类型变量

Asa*_*saf 5 haskell types compiler-errors

所以我意识到这是一个可能重复的问题,因为在Stack Overflow上报告了许多错误,但没有一个解决方案似乎适用于我的问题.

所以我有以下功能:

elementAt' :: Integral b => [a] -> b -> a
elementAt' [x:_] 1 = x
elementAt' [x:xs] y = elementAt' xs yminus1
    where yminus1 = y - 1
Run Code Online (Sandbox Code Playgroud)

如果您想知道99 Haskell问题中的问题3 .该函数的目标是将列表和索引作为输入,并返回该索引处的值(从1开始).我不想解决这个问题,如果我这样做,我可以看看提供的解决方案.但我收到一个我不明白的错误.我正在使用eclipseFP,它是haskell的eclipse插件,它强调了函数的"[x:_]"和"[x:xs]"部分,并出现以下错误:

Couldn't match type `a' with `[a]'
`a' is a rigid type variable bound by
the type signature for elementAt' :: Integral b => [a] -> b -> a
Run Code Online (Sandbox Code Playgroud)

在讨论这个错误的所有线程中,我已经看到问题通常发生在有人试图将错误的输出提供给需要某种类型的东西时.例如,将某些东西(Int类型)的长度返回到应该是"Num a"变量类型的长度.

但在我的情况下,我甚至没有提供变量a的类型.它应该可以是任何东西,对吧?那我为什么会收到这个错误呢?如果我理解为什么我得到错误我可以解决它,但我只是不明白.

有人可以向我解释为什么我收到这个错误?

非常感谢您的帮助,谢谢.-Asaf

编辑:到目前为止提供的每个答案都是正确的,谢谢大家提供的有用信息.我要选择一个我认为最清楚的那个(我必须等5分钟才能完成).

小智 9

输入没有类型声明的定义表明推断类型是Integral b => [[a]] -> b -> a.这是正确的,您当前的模式匹配列表列表.

一种模式

f [pat] = ...
Run Code Online (Sandbox Code Playgroud)

匹配唯一元素匹配的单例列表pat.你想使用consaka (:)而不是要求一定的长度,然后你需要括号而不是括号:

elementAt' (x:xs) n = ...
Run Code Online (Sandbox Code Playgroud)

该错误基本上表示"你对待a(第一个参数的元素)就像它是一个列表".


ДМИ*_*КОВ 3

如果你想将列表匹配到头部和尾部,你应该使用

\n\n
elementAt' (x:_) 1 = x\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以,最后

\n\n
elementAt' :: Integral b => [a] -> b -> a\nelementAt' (x:_) 1 = x\nelementAt' (x:xs) y = elementAt' xs yminus1\n    where yminus1 = y - 1\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n
\xce\xbb> elementAt' [1,2,3] 2\n2\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是你需要的吗?

\n