【问题标题】:Haskell: Filter a list of tuples with conditionHaskell:过滤带有条件的元组列表
【发布时间】:2018-02-15 21:41:55
【问题描述】:

我有一个要应用特定条件的元组列表。 Il 看起来很简单,但我坚持这一点。 元组列表已全部生成

例如:[(10,11),(11,10),(11,12),(12,11),(13,15),(13,14)]

我想返回相同元组的列表,但是当元组 (x1,y1) 和 (x2,y2) 其中 x1 == y2 和 y1 = x2 并且仅属于 (x1,y1) 的列表时被退回

我的函数头

myFun :: Ord a => [(a,a)] -> [(a,a)]
    myFun = ....

并且预期的结果应该是这样的(来自同一个列表)

[(10,11),(11,12),(13,15),(13,14)]

欢迎任何指示、想法或提示。

【问题讨论】:

  • 你尝试了什么?
  • myFun = nubBy $ \(x1, y1) (x2, y2) -> x1 == y2 && y1 == x2
  • 太好了,我希望我能理解更多的 lambda 表达式
  • 也可以:map head $ groupBy (\(x1, y1) (x2, y2) -> x1 == y2 && x2 == y1) xs

标签: haskell filter


【解决方案1】:

经过一番尝试,我想出了这个:

myFun::Ord a => [(a,a)] -> [(a,a)]
myFun ls = auxfun [] ls

auxfun:: Eq a => [(a,a)] -> [(a,a)] -> [(a,a)]
auxfun [] [] = []
auxfun [] (l:ls) = auxfun [l] ls
auxfun ls [] = ls
auxfun ls1 ((x,y):ls2)
    |(y,x) `elem` ls1 = auxfun ls1 ls2
    |otherwise = auxfun ((x,y):ls1) ls2

这将在您的测试用例中返回 [(13,14),(13,15),(11,12),(10,11)],如果顺序很重要,您可以将其反转。

此解决方案不使用任何库,否则您可以像其他人所说的那样使用 nubBy。

【讨论】:

  • @Alexis King 在评论部分的回答完成了这项工作,但感谢您的努力,我也会尝试这个
【解决方案2】:

我看到它已经被回答了,但是由于 haskell 非常有趣并且总是有更多可能的解决方案,我将添加一个我发现的:

foldr (\x y -> if x == rev (head) y then (x:tail y) else x:y) [rev $ last xs] xs where
  rev (a,b) = (b,a)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    相关资源
    最近更新 更多