2017-05-12 2 views
14

[Maybe Int]のリストにallを使用することはできますか?「すべて」はおそらくリストにも適用できますか?

私が知っているall (< 9) [2,4,6,8,10]Falseを返しますが、それは整数だけのリストを使用しています。

私はこのようになりますリストを除いて似た何かを達成しようとしています:
[Just 3, Just 6, Nothing, Nothing, Just 7]

私はall (<=9) [Just 3, Just 6, Nothing, Nothing, Just 7]NothingがどのJust x未満であるため、この作品True

答えて

23
> all (<= Just 9) [Just 3, Just 6, Nothing, Nothing, Just 7] 
True 

を返すようにしたいです。

> all (<= 9) $ catMaybes [Just 3, Just 6, Nothing, Nothing, Just 7] 
True 

あるいは、その後、通常のように取り扱うことができる番号のリストにリストを回し、Nothing Sを廃棄するData.MaybeモジュールからcatMaybes :: [Maybe a] -> [a]を使用し、Justラッパーを除去することができますもう1つの選択肢:Maybe Intに独自の述語を定義する。

さらに良い
let p :: Maybe Int -> Bool 
    p Nothing = True 
    p (Just x) = x <= 9 
in all p [Just 3, Just 6, Nothing, Nothing, Just 7] 

Zeta suggestsとして、maybeを使用してpを定義します。

and [ x <= 9 | Just x <- [Just 3, Just 6, Nothing, Nothing, Just 7] ] 
+0

は、(すべての 'のような何かをすることが可能です> = Just 1 && <= Just 9)[Just 3、Just 6、Nothing、Nothing、Just 7] ' これはPreludeでは動作しないようです。 – 0248881

+1

'all(\ x - > x> = Just 1 && x <= Just 9)... 'を使うことができますが、' Nothing'は最小であることを忘れないでください。 'catMaybes'を使うか、または' better'を使って(おそらくTrue(\ x - > x> = 1 && x <= 9))... '012'を使って述語を持ち上げてください。 – chi

+0

ありがとう!それは私がスドクソルバーを作っているので、スドクにゼロがないので便利です! – 0248881

12

確かに:リスト内包とandを使用してさらに別の代替

、。 maybe True (< 9)。あなたはNothingを持っている場合はJust、またはdefaultを持っている場合maybe default funcは、与えられた関数funcを使用しています。

ghci> all (maybe True (< 9)) [Just 3, Just 6, Nothing, Nothing, Just 7] 
True 

あなたのallMaybe関数を記述するためにそれを使用することができます

allMaybe :: (a -> Bool) -> [Maybe a] -> Bool 
allMaybe p = all (maybe True p) 

それとも私たちはあなたを「持ち上げる」でした述語からMaybe

liftP :: (a -> Bool) -> Maybe a -> Bool 
liftP _ Nothing = True 
liftP p (Just x) = p x 
-- or simply 
-- liftP p = maybe True p 

allMaybe' p = all (liftP p) 

しかし、基礎となるmaybeを離します。

+0

述語を 'maybe'で持ち上げるのが実際には最良の方法です。 – chi

13

A chiZetaによるものよりやや難解なソリューションがallが数字を含む単一の構造として2層を見ているので、Composeを使用することになります。

GHCi> import Data.Functor.Compose 
GHCi> all (<=9) $ Compose [Just 3, Just 6, Nothing, Nothing, Just 7] 
True 
関連する問題