Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Haskell集理解_List_Haskell_Set_List Comprehension - Fatal编程技术网

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约束