Haskell集合理解

时间:2015-08-06 14:11:05

标签: list haskell set list-comprehension

是否有可能(例如语言扩展名)使用Data.Set集的列表推导语法语法?

示例:

f :: Set a -> Set b -> Set (a,b)
f xs ys = [(x,y) | x <- xs , y <- ys] -- this is the set comprehension

由于集合是激发列表理解的数学结构,因此不具备在集合中使用它们的可能性会很奇怪。

是的,我知道MonadComprehensions使用list-comp语法与任何Monad / MonadPlus类型,但AFAIK集甚至不能成为monad因为

。大多数函数都有Ord约束。

1 个答案:

答案 0 :(得分:6)

理论上,没有

没有语言扩展允许“设置理解”。

SetList之间的差异是:

  1. Set在订购List时无序
  2. Set的元素是唯一的,而List可能有重复的元素
  3. Set的类型是Ord的实例,而List没有类型限制。
  4. 您可以看到所有可能的Set都是所有可能List的严格子集。这意味着我们可以简单地使用列表理解并将其转换为Set来实现“集合理解”。延迟评估经常使得“集合生成”从大多数有限列表推导中获得高效。但是,导致无限列表的列表推导不太可能导致有效的“集合理解”。

    示例:

    import Data.Set
    
    set :: Ord a => Set a
    set = fromList [x * y | x <- [1..10], y <- [1..10]]
    

    在实践中,是

    使用set-monad包,您可以将Set定义为Monad的实例,并使用语言扩展名MonadComprehensions即可实现“设置理解”。< / p>

    示例:

    {-# LANGUAGE MonadComprehensions #-}
    import Data.Set.Monad
    
    set1 :: Set (Int,Int)
    set1 = do 
             a <- fromList [1 .. 4]
             b <- fromList [1 .. 4]
             return (a,b)
    
    -- Look a "set comprehension"
    set2 :: Set (Int,Int)
    set2 = [ (a,b) | (a,b) <- set1, even a, even b ]
    

    使用对您的项目最有意义的方法。在作出决定之前对其进行描述!