gpt4 book ai didi

Haskell 代码错误 - 我不明白它的要求

转载 作者:行者123 更新时间:2023-12-01 08:35:39 25 4
gpt4 key购买 nike

第一次发帖,但是这个网站帮了我很多。

我正在努力学习 Haskell。

这是我被要求回答的问题。

编写一个函数,该函数接受长度对的列表(长度 >=2)并返回列表中第二个元素的第一个组件。因此,当提供 [(5,'b'), (1,'c'), (6,'a')] 时,它将返回 1。

这是我自己做的。

listtwo :: [([a],b)] -> [a]
listtwo [] = []
listtwo [(a,b)] = fst (head (tail [(a,b)]))

我正在尝试获取列表的列表我相信的元组并返回列表中第二项的第一个元素。我知道如果您取出 [(a,b)] 并将第二个 [(a,b)] 替换为问题中的列表,它可以正常工作。但是当我试图让这个函数适用于任何元组列表时。我收到错误。

我收到错误

<interactive>:1:27:
No instance for (Num [a0])
arising from the literal `6'
Possible fix: add an instance declaration for (Num [a0])
In the expression: 6
In the expression: (6, 'a')
In the first argument of `listtwo', namely
`[(5, 'b'), (1, 'c'), (6, 'a')]'

所以我问是否有人可以帮助我解决错误并解释我做错了什么(不要给我答案,不能这样学习)。

感谢帮助,如果得到解答,可能会有更多问题。非常感谢您!

最佳答案

你说你想要一个返回列表的第二个元素第一个组件的函数。编写此函数的最佳方法是模式匹配。但首先,让我们考虑一下它的类型。

假设你想要一个 (Int,Char) 的元组列表。这写为 [(Int,Char)]。如果您想要一个任意类型的 2 元组列表,请将类型 IntChar 替换为类型变量,因此您最终会得到类型 [( a,b)].

您的函数需要采用这种类型,并返回列表第二个元素的第一个组件。元组的所有第一个组件都有类型 a,因此您的返回类型也必须是 a。所以你的函数的类型签名是

f :: [(a,b)] -> a

现在,我们如何编写这个函数?最好的方法是使用模式匹配。这是一种无需使用访问器(也称为 getter,如果您来自面向对象的背景)即可提取数据结构组件的简洁方法。假设我们有一个函数 g::[a] -> a,它返回列表的第三部分。你可以写

g :: [a] -> a
g xs = head (tail (tail xs))

但这看起来很糟糕。另一种方法是模式匹配。一个包含三个元素 [x,y,z] 的列表可以通过 x : y : z : [] where x, yz 都是 a 类型(记住运算符 : 将项目添加到列表的前面) .所以我们可以这样写:

g :: [a] -> a
g (x : y : z : []) = z

但这有一个问题——它只适用于长度为 3 的列表,因为我们的模式说“匹配一个包含三个元素的列表,最后添加一个空列表”。相反,我们可以使用模式 x : y : z :rest,现在 rest 匹配列表的其余部分:

g :: [a] -> a
g (x : y : z : rest) = z

我们的模式现在说“匹配一个包含三个元素的列表,然后再匹配其他任何元素。”事实上,我们可以让它变得更简单。我们不会使用值 xyrest,所以我们可以用 Haskell 模式 _(下划线)。这匹配任何东西,并让我们保证我们不会使用该值:

g :: [a] -> a
g (_ : _ : z : _) = z

我们如何使用它来解决您的问题?好吧,如果你有一个匹配模式 (w,x) : (y,z) : rest 的列表,你会想要返回 y。所以你可以写:

f :: [(a,b)] -> a
f ( (w,x) : (y,z) : rest ) = y

这会很好。但是,您根本不关心第一对,因此您可以将 (w,x) 替换为 _。您也不关心第二个元组的第二个元素或列表的其余部分,因此您也可以用 _ 替换它们,得到:

f :: [(a,b)] -> a
f ( _ : (y,_) : _) = y

在 ghci 中检查:

ghci> f [(5,'b'),(1,'c'),(6,'a')]
1

所以它的行为正如你所期望的那样。

关于Haskell 代码错误 - 我不明白它的要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10985718/

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