我试图编写一个函数,如果第一个元组的两个元素出现在后一个元组的任何元组中,则必须将一个元组与一个元组列表相匹配,并返回一个bool。到目前为止,我已经尝试使用elem
(只有当我的第一个列表与子列表有相同数量的元素时才有效)和isInfixOf
(变量不在作用域内)。有什么线索吗?
matching ("Monday","Tuesday") [("Monday","Tuesday",10),("Tuesday","Sunday",20), ("Wednesday", "Friday", 22)] -> False
matching ("Monday","Tuesday") [("Tuesday","Monday",10),("Tuesday","Sunday",20), ("Wednesday", "Friday", 22)] -> False
发布于 2017-02-13 19:09:29
让我们看看你想做什么:
True
,否则返回False
。True
,如果没有匹配,则返回False
。是否有帮助的标准函数?胡格尔是用来尝试和查找帮助函数的资源。当然,在知道要搜索什么的过程中有一条学习曲线。
我尝试了(a -> b -> Bool) -> a -> [b] -> Bool
,它是您的函数的类型,其中a
是要匹配的元组,b
是列表中的元组。这没有得到任何有用的匹配。但是,我尝试了(b -> Bool) -> [b] -> Bool
的结果是这里,第二个匹配是一个名为any
的函数(第一个函数是all
,它很有用,但不满足您的需要!)
现在,我们所需要的只是一个函数,它接受元组,如果它们匹配,返回true。
用你的元组我试过(a,b) -> (a,b,c) -> Bool
和..。没有找到火柴!看来我们得自己写了。
像这样的东西应该可以工作:compareTuples a b = fst a == fst b && snd a == snd b
或compareTuples (a,b) (c,d, _) = a == c && b == d
。
嗯,这个函数有(a -> b -> Bool)
类型,但是any
采用(b -> Bool)
,那么我们如何使它工作呢?当然是部分应用!
matching t xs = any (compareTuples t) xs
发布于 2017-02-13 18:49:09
这里有一种使用折叠的方法:
matching (p,q) lst = foldl (\acc (x,y,_) -> if (x == p) && (y==q) then True || acc else False || acc) False lst
基本上,对列表中的元组进行输入模式匹配。如果找到至少一个匹配项,则累加器将设置为True。
发布于 2017-02-13 19:32:56
如果你使用镜片很简单
matching a bs = not . any (\b -> (a^._1 == b^._1 && a^._2 == b^._2)
|| (a^._1 == b^._2 && a^._2 == b^._1) ) $ bs
这可以通过减少埃塔来进一步简化:
matching a = not . any (\b -> (a^._1 == b^._1 && a^._2 == b^._2)
|| (a^._1 == b^._2 && a^._2 == b^._1) )
https://stackoverflow.com/questions/42216356
复制相似问题