gpt4 book ai didi

haskell - Haskell 中的 Just 是什么?为什么没有它这个函数就不能工作?

转载 作者:行者123 更新时间:2023-12-02 14:03:17 24 4
gpt4 key购买 nike

我有以下函数,其作用类似于索引运算符:

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 会与 l 的类型混淆,为什么它需要一个 Maybe a 类型的列表?最后,Just如何解决问题?

最佳答案

您在类型注释中明确指出,您的函数 index 返回一个 Maybe a

也许是 Haskell 中定义的一种数据类型:

data Maybe a = Just a | Nothing

也就是说,它有两个值构造函数,Just::a -> Maybe aNothing::Maybe a。因此,为了使您的函数正常工作,它必须返回 Just aNothing

这也意味着您应该能够稍微思考一下删除错误语句,并将实际错误编码到 Nothing 中(即,我们超出了范围,这里没有元素!)并且仅在有意义时才返回结果 Just a

关于haskell - Haskell 中的 Just 是什么?为什么没有它这个函数就不能工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11677789/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com