【发布时间】:2022-01-11 01:52:04
【问题描述】:
我正在玩我在 Haskell 中的第一次非平凡的(在我眼中)尝试。我可能会询问有关每个部分的问题,以将我的长期关系与类似 c 语言的尝试与您作为经验丰富的功能程序员可能会做的事情进行比较。幸运的是,Haskell 很难依靠直接的 c 到 Haskell 代码转换。你必须学会如何正确地做这件事——我想这样做。
对于这一部分,我有一个 [2uple] 和一个 2uple。我想知道 2uple 中的任何项目是否在 [2uple] 中的任何项目中。
hasmatch tlst tupm = foldr (\tup acc ->
let tmatch (a,b) (c,d) = a==c || b==c || a==d || b==d in
if tmatch tup tupm
then (Just True) -- short out
else acc -- do nothing, keep looping
) Nothing tlst
-- hasmatch [(1,2), (3,4), (5,6)] (5,3) ==> Just True
-- hasmatch [(1,2), (9,4), (7,6)] (5,3) ==> Nothing
我更愿意返回一个普通的 Bool 但没有什么大不了的。
我敢肯定还有另一种方法,我需要摸索一段时间才能理解。那很好。正在寻找接受者。
谢谢
【问题讨论】:
-
什么意思,元组不是必需的?你有一对东西和一对列表吗?还是你有别的事?
-
@amalloy 我删除了令人困惑的行...
-
在任何支持配对的语言中(
C、Haskell、Basic、ALGOL、...):(5,3) /= (3,5)。这确实是元组的重点。那么,为什么在您的==> Just True结果中,您希望将列表中元组右侧位置的3与列表中元组左侧位置的3匹配?你的名单不就是Eq a => [a]吗?如果您在C中执行此操作,“业务/需求方案”会是什么? -
如果元组中的位置真的无关紧要:将
tlst中的元组展平为一个裸元素列表;同样将tupm中的这对扁平化为 2 元素列表;寻找扁平化tupm是扁平化tlst的子集。 (寻找一个列表的一个子集是一个常见问题解答。) -
如果唯一可能的输出是
Just True和Nothing,为什么要返回Maybe Bool?为什么不分别返回True/False?
标签: haskell tuples comparison