List Haskell集理解
对于List Haskell集理解,list,haskell,set,list-comprehension,List,Haskell,Set,List Comprehension,对于Data.SetSet,是否有可能使用列表理解语法的语法(例如语言扩展) 示例: f :: Set a -> Set b -> Set (a,b) f xs ys = [(x,y) | x <- xs , y <- ys] -- this is the set comprehension import Data.Set set :: Ord a => Set a set = fromList [x * y | x <- [1..10], y <-
Data.Set
Set,是否有可能使用列表理解语法的语法(例如语言扩展)
示例:
f :: Set a -> Set b -> Set (a,b)
f xs ys = [(x,y) | x <- xs , y <- ys] -- this is the set comprehension
import Data.Set
set :: Ord a => Set a
set = fromList [x * y | x <- [1..10], y <- [1..10]]
{-# 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 ]
f::设置a->设置b->设置(a,b)
f xs ys=[(x,y)| x在理论上,否
没有允许“集合理解”的语言扩展
集合
和列表
之间的区别是:
集合
是无序的,而列表
是有序的
集合
的元素是唯一的,而列表
可能有重复的元素
集合
的类型是Ord
的一个实例,而列表
没有类型限制
您可以看到,所有可能的Set
s都是所有可能的List
s的严格子集。这意味着我们可以通过使用列表理解并将其转换为Set
来实现“Set comprehension”。惰性评估通常会导致“Set generation”源于大多数有限列表理解的有效列表理解。然而,产生无限列表的列表理解不太可能产生有效的“集合理解”
示例:
f :: Set a -> Set b -> Set (a,b)
f xs ys = [(x,y) | x <- xs , y <- ys] -- this is the set comprehension
import Data.Set
set :: Ord a => Set a
set = fromList [x * y | x <- [1..10], y <- [1..10]]
{-# 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 ]
使用对您的项目最有意义的方法。在做出决定之前,请同时对这两种方法进行分析!Err…延迟求值如何提高集合生成的效率?您必须对所有列表求值才能创建集合。延迟求值在这里似乎没有任何作用。@Cubic您将不会生成整个列表,然后生成集合整个集合。由于延迟计算,该操作将融合,因此如果我生成单个元素的大量副本列表,我将不会产生内存开销,因为集合将从列表中惰性地绘制并创建单例集合。根据fromList的实现,在最好的情况下,如果st是大懒散可以给GC一个机会,让它在将尾部输入集合生成器时扫除列表的头部。但在现实世界中,我怀疑这是否会有任何影响。一个在无限输入上发散的函数并不是大多数人所说的懒散。@MathiasDolidon可能是可折叠的
或类似列表的
。它可能是相互关联的测试可折叠的
实例是否可以泛化为允许任意“列表理解”语法。集合是启发列表理解的数学结构
但数据。集合不是该结构,因为Ord约束
。