Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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
Haskell 哈斯凯尔:也许是数据。设定?_Haskell_Set_Maybe - Fatal编程技术网

Haskell 哈斯凯尔:也许是数据。设定?

Haskell 哈斯凯尔:也许是数据。设定?,haskell,set,maybe,Haskell,Set,Maybe,如何实现Data.Set的catMaybes 我想到了: import qualified Data.Set as Set import qualified Data.Maybe as Maybe setCatMaybes a = Set.map Maybe.fromJust . Set.delete Nothing $ a fnord = Set.fromList [Nothing, Just 41, Just 43, Just 47] 然后我得到了以下结果 setCatMaybes fn

如何实现Data.Set的catMaybes

我想到了:

import qualified Data.Set as Set
import qualified Data.Maybe as Maybe
setCatMaybes a = Set.map Maybe.fromJust . Set.delete Nothing $ a

fnord = Set.fromList [Nothing, Just 41, Just 43, Just 47]
然后我得到了以下结果

setCatMaybes fnord == fromList [41,43,47]
就这样吧:

setCatMaybes = Set.fromList . catMaybes
这只需要遍历列表一次,因为
已设置。fromList
是一个很好的消费者。

这样如何:

setCatMaybes = Set.fromList . catMaybes

这只需要遍历列表一次,因为
集。fromList
是一个很好的消费者。

我认为您现有的解决方案可能是最好的。按照John的解决方案,这里有一个相当简短的解决方案:

setCatMaybes :: Ord a => Set.Set (Maybe a) -> Set.Set a
setCatMaybes s = Set.fromAscList [x | Just x <- Set.toAscList s]

我认为你现有的解决方案可能是最好的。按照John的解决方案,这里有一个相当简短的解决方案:

setCatMaybes :: Ord a => Set.Set (Maybe a) -> Set.Set a
setCatMaybes s = Set.fromAscList [x | Just x <- Set.toAscList s]
既然
Set(maybea a)
是一种非常奇怪的类型,只有在应用
f::a->maybea b
之后才会出现,为什么不一石二鸟,为
数据.Set
创建一个
maybea

import qualified Data.Set
import qualified Data.Maybe

mapMaybe :: Ord b => (a -> Maybe b) -> Data.Set.Set a -> Data.Set.Set b
mapMaybe f = Data.Set.fromList . Data.Maybe.mapMaybe f . Data.Set.toList
这样,奇怪的
Set(Maybe a)
就不存在了。

既然
Set(Maybe a)
是这样一种奇怪的类型,只有在应用
f::a->Maybe b
之后才会出现,为什么不一石二鸟,为
数据创建一个
地图呢

import qualified Data.Set
import qualified Data.Maybe

mapMaybe :: Ord b => (a -> Maybe b) -> Data.Set.Set a -> Data.Set.Set b
mapMaybe f = Data.Set.fromList . Data.Maybe.mapMaybe f . Data.Set.toList

这样,奇怪的
Set(可能是a)
就不存在了。

但是这个列表的类型是
setCatMaybes::(Ord a)=>[可能是a]->Set.Set a
。然而,我正在寻找一个类型为
setCatMaybes::(Ord a)=>Set.Set(可能是a)->Set.Set(可能是a)
的函数。在这种情况下,您的版本似乎是最简单的,但我确实认为拥有
Set
可能是
s是很奇怪的。为什么不把
集合a
插入maybe mx Set=(maybe id Set.insert mx)集合一起使用呢?拥有一组
maybe a
确实很奇怪!与
a
集合的唯一真正区别在于,它也可能包含一个
Nothing
。我有一个
foo
类型的集合
set.set a
和一个函数
fun::a->Maybe b
。我使用
Set.map fun foo
在集合上映射此函数。这就是我得到一套可能的原因。顺便问一下,我应该选择一个最好的答案,还是让这个话题继续讨论?我不熟悉堆栈溢出。但是这个列表的类型是
setCatMaybes::(Ord a)=>[maybea]->Set.Set a
。然而,我正在寻找一个类型为
setCatMaybes::(Ord a)=>Set.Set(可能是a)->Set.Set(可能是a)
的函数。在这种情况下,您的版本似乎是最简单的,但我确实认为拥有
Set
可能是
s是很奇怪的。为什么不把
集合a
插入maybe mx Set=(maybe id Set.insert mx)集合一起使用呢?拥有一组
maybe a
确实很奇怪!与
a
集合的唯一真正区别在于,它也可能包含一个
Nothing
。我有一个
foo
类型的集合
set.set a
和一个函数
fun::a->Maybe b
。我使用
Set.map fun foo
在集合上映射此函数。这就是我得到一套可能的原因。顺便问一下,我应该选择一个最好的答案,还是让这个话题继续讨论?我不熟悉堆栈溢出。