Haskell集合理解

kme*_*ein 6 haskell list-comprehension list 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
Run Code Online (Sandbox Code Playgroud)

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

是的,我知道MonadComprehensions将list-comp语法与任何Monad/ MonadPlus类型一起使用,但由于Ord大多数函数的约束,AFAIK集甚至不能成为monad .

rec*_*nja 6

在理论上,没有

没有语言扩展允许"设置理解".

a Set和a 之间的区别List是:

  1. Set同时是无序List的有序
  2. 元素Set是唯一的,而List可能有重复的元素
  3. 类型Set是一个实例,OrdList没有类型限制.

您可以看到所有可能的Sets都是所有可能s的严格子集List.这意味着我们可以简单地使用列表理解并将其转换为a来实现"集合理解" Set.懒惰的评估通常会使"集合生成"从大多数有限列表推导中获得高效.但是,导致无限列表的列表推导不太可能导致有效的"集合理解".

例:

import Data.Set

set :: Ord a => Set a
set = fromList [x * y | x <- [1..10], y <- [1..10]]
Run Code Online (Sandbox Code Playgroud)

在实践中,是的

使用该set-monad包,您可以定义一个Set实例, Monad并使用语言扩展MonadComprehensions来实现"设置理解".

例:

{-# 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 ]
Run Code Online (Sandbox Code Playgroud)

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

  • 在无限输入上发散的函数不被大多数人称为懒惰. (3认同)
  • @MathiasDolidon 可能是`Foldable` 或`ListLike`。如果`Foldable` 的实例可以泛化以允许任意的“列表理解”语法,那将会很有趣。 (2认同)