gpt4 book ai didi

haskell - 将非空列表传递给函数

转载 作者:行者123 更新时间:2023-12-02 17:00:22 25 4
gpt4 key购买 nike

我编写了这个小函数来检索列表的尾部:

let getTail l = if length l > 0 then tail l else "empty list"

[]传递给getTail返回空列表,但传递[1,2,3]给出以下错误:

<interactive>:1:14:
No instance for (Num Char)
arising from the literal `3'
Possible fix: add an instance declaration for (Num Char)
In the expression: 3
In the first argument of `getTail', namely `[1, 2, 3]'
In the expression: getTail [1, 2, 3]

我无法理解该错误的含义。问题是什么?使用GHCi 7.0.4

最佳答案

让我们考虑一下 getTail 函数的类型。最初,我们可以将 l 想象为任何列表。然而,返回类型必须是String,因为有时您会返回“空列表”。由于这是 if 语句的一部分,您还可能返回 tail l,这意味着 l 必须 是一个 String >.

因此,您的 getTail 函数的类型为 String -> String

当您使用 [1,2,3] 调用 getTail 时,它需要一个 String,它只是一个 [字符]。请记住,数字文字是重载的:[1,2,3] 相当于调用 [fromInteger 1, fromInteger 2, fromInteger 3]。因此,根据这个列表,Haskell 尝试从 Char 中获取数字。由于 Char 不是 Num 类的一部分,因此此操作会失败,并给出错误。

一个好的解决方案是返回一个Maybe类型并对错误给出Nothing而不是返回“空列表”。因此,将您的函数重写为:

let getTail l = if length l > 0 then Just (tail l) else Nothing

现在它的类型是[a] -> Maybe [a]。使用此功能将强制使用您的函数的任何人在能够使用结果之前检查 getTail 是否成功。

另一个选项是返回[]来代替“空列表”。在这种情况下,您的 getTail 函数的工作方式与 drop 1 完全相同。

关于haskell - 将非空列表传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11595135/

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