繁体   English   中英

Haskell集合理解

[英]Haskell Set Comprehensions

是否有可能(例如语言扩展)为Data.Set集使用列表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类型,但由于大多数函数中的Ord约束,AFAIK集甚至不能成为monad。

在理论上,没有

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

SetList之间的区别是:

  1. 在订购List时, Set是无序的
  2. Set的元素是唯一的,而List可能有重复的元素
  3. Set的类型是Ord的实例,而List没有类型限制。

您可以看到所有可能的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来实现“set comprehension”。

例:

{-# 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 ]

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM