gpt4 book ai didi

list - 尝试获取最后一个元素时出现Haskell错误

转载 作者:行者123 更新时间:2023-12-03 08:00:23 25 4
gpt4 key购买 nike

因此,我正在尝试实现一个函数,给定3个元素的列表((Int,Int),Int),当第二个位置上的所有3个元素的值都相同时,返回True,否则返回False

例如,[((1,2),7),((5,3),7),((1,9),7)]应该返回True,而[((1,2),3),((5,3),3),((1,9),5)]应该返回False

这是我的代码:

bc :: [((Int,Int),Int)]
wcheck :: [((Int,Int),Int)] -> Bool
wcheck bc
| (( fst(fst bc) == fst(snd bc) ) && ( fst(snd bc) == fst(last bc) )) = True
| otherwise = False

和我得到的错误:
E:\\study related\Module1\week 4\ttt.hs:55:65: error:
* Couldn't match expected type `[(a, b0)]'
with actual type `((a, b), (a, b1))'
* In the first argument of `last', namely `bc'
In the first argument of `fst', namely `(last bc)'
In the second argument of `(==)', namely `fst (last bc)'
* Relevant bindings include
bc :: ((a, b), (a, b1))
(bound at E:\\study related\Module1\week 4\ttt.hs:54:8)
wcheck :: ((a, b), (a, b1)) -> Bool
(bound at E:\\study related\Module1\week 4\ttt.hs:54:1)
|
55 | | (( fst(fst bc) == fst(snd bc) ) && ( fst(snd bc) == fst(last bc) )) = True
|

您能否告诉我为什么会出现此错误以及解决方法?谢谢。

最佳答案

如果我们执行简单的模式匹配而不是使用fst :: (a, b) -> a等,则可能会更容易。

元组的第一项的第二项

我们可以使用((_, x), _)模式从包裹在2元组中的2元组中获取第二个元素。

因此我们可以使用模式匹配,例如:

wcheck :: [((Int,Int),Int)] -> Bool
wcheck [((_, x), _), ((_, y), _), ((_, z), _)] = x == y && y == z
wcheck _ = False

因此,如果列表中包含三个元素,我们将解压缩这些元素,然后检查“第二个项目”是否彼此相等。如果模式不匹配(对于元素太少或太多的列表),我们只返回 False

但是,“三个要素的 list ”没有多大意义。如果在编译时知道元素的数量,则最好使用元组,因为这样,编译器可以验证您只能为该函数提供3元组。

元组的第二项

如果我们对元组的第二项感兴趣,可以将 (_, x)用作模式(我们对第一项都不感兴趣):
wcheck :: [((Int,Int),Int)] -> Bool
wcheck [(_, x), (_, y), (_, z)] = x == y && y == z
wcheck _ = False

请注意,我们可以通过以下方式概括签名:
wcheck :: Eq c => [((a, b), c)] -> Bool
wcheck [(_, x), (_, y), (_, z)] = x == y && y == z
wcheck _ = False

关于list - 尝试获取最后一个元素时出现Haskell错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52567206/

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