Haskell 哈斯凯尔:也许是数据。设定?
如何实现Data.Set的catMaybes 我想到了: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
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
在集合上映射此函数。这就是我得到一套可能的原因。顺便问一下,我应该选择一个最好的答案,还是让这个话题继续讨论?我不熟悉堆栈溢出。