【问题标题】:Haskell List Comprehension, where x can't be equal to an element of a listHaskell List Comprehension,其中 x 不能等于列表的元素
【发布时间】:2023-03-31 23:20:01
【问题描述】:

我想从一个元组列表中生成一个元组列表,其中元组的左边部分只出现在列表所有元素的左侧。

基本上我想要的是以下更通用的版本:

[ (x,y) | (x,y) <- [(1,5),(5,2)], x /= 5, x /=2 ]

如果 [(1,5),(5,2)] 是一个名为 list 的变量,那么 x 不能等于 (map snd list) 的任何值。如何将此条件置于列表理解中? (或者我应该使用其他东西吗?比如过滤器?)

【问题讨论】:

    标签: list haskell list-comprehension


    【解决方案1】:

    那么 x 不能等于 (map snd list) 的任何值

    直接翻译是

    x `notElem` map snd list
    

    所以你会使用类似的东西

    let xs = [(1,5),(5,2)] in [(x,y) | (x,y) <- xs, x `notElem` map snd xs]
    

    如果列表很长,那效率不高,那么您可以 - 如果类型允许,即是 Ord 的实例 - 构建一个集合并检查集合中的成员身份

    let xs = [(1,5),(5,2)]
        st = Data.Set.fromList (map snd xs)
    in [(x,y) | (x,y) <- xs, not (Data.Set.member x st)]
    

    将第一个的 O(n²) 复杂度降低到 O(n*log n) 复杂度。

    【讨论】:

    • 谢谢,这很有帮助 :) 我选择了你的第二个建议 :)
    【解决方案2】:

    构造所有第二个元素的Set(我们称之为seconds),然后只过滤flip notMember seconds . fst。如果你真的想的话,你可以很容易地把它写成一个列表推导式(但你最终会重写过滤器,那为什么要这样做呢?)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      相关资源
      最近更新 更多