我有以下函数,其作用类似于索引运算符:
let {
index :: [a]->Int->Maybe a
index [] i = error "Empty list"
index l i = if i <= ((length l) - 1) && i >= 0 then
Just(l !! i)
else
error "Index out of bounds"
}
现在,最初我没有使用就写了这个Just
(我仍然不明白谷歌搜索后它是什么):
let {
index :: [a]->Int->Maybe a
index [] i = error "Empty list"
index l i = if i <= ((length l) - 1) && i >= 0 then
(l !! i)
else
error "Index out of bounds"
}
对我来说,上述功能非常有意义。因为这里我有一个函数,它接受一个“通用类型”列表,a
一个Int
是索引并返回Maybe
类型的值a
或引发运行时异常。但是,我不明白 GHCi 告诉我的地方:
<interactive>:1:120:
Couldn't match type `a' with `Maybe a'
`a' is a rigid type variable bound by
the type signature for index :: [a] -> Int -> Maybe a
at <interactive>:1:34
Expected type: [Maybe a]
Actual type: [a]
In the first argument of `(!!)', namely `l'
In the expression: (l !! i)
现在,为什么 GHCi 会与 type 的类型混淆,l
为什么它需要一个 type 的列表Maybe a
?最后,如何Just
解决问题?