1

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]
4

4 に答える 4

3

Set (Maybe a)は の適用後にのみ現れる奇妙なタイプなのでf :: a -> Maybe b、一石二鳥のmapMaybeforを作成してみData.Setませんか?

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)は決して存在しません。

于 2011-10-06T15:00:38.013 に答える
3

あなたがすでに持っている解決策はおそらく最良のものだと思います。ジョンのソリューションに沿って、かなり短いものを次に示します。

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

または、これはより長いもので、より高速な場合があります。

setCatMaybes2 :: Ord a => Set.Set (Maybe a) -> Set.Set a
setCatMaybes2 s
  | Set.null s = Set.empty
  | otherwise  = Set.mapMonotonic Maybe.fromJust $ case Set.deleteFindMin s of
                   (Nothing, s') ->  s'
                   _ -> s
于 2011-02-23T13:38:19.540 に答える
0

これだけはどうですか:

setCatMaybes = Set.fromList . catMaybes

Set.fromListこれは、優れたコンシューマーであるため、リストを1回トラバースするだけで済みます。

于 2011-02-23T11:41:21.667 に答える