2017-05-12 4 views
14

Ist es möglich, all auf einer [Maybe Int] Liste zu verwenden?Kann 'all' auf eine Liste von Maybe angewendet werden?

Ich weiß all (< 9) [2,4,6,8,10] gibt False zurück, aber das verwendet eine Liste mit nur ganzen Zahlen.

Ich versuche, etwas ähnlich, außer mit einer Liste zu erreichen, die wie folgt aussieht:
[Just 3, Just 6, Nothing, Nothing, Just 7]

I all (<=9) [Just 3, Just 6, Nothing, Nothing, Just 7] wollen True

Antwort

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

Dies funktioniert zurückkehren, weil Nothing als jede Just x weniger ist.

Alternativ kann man catMaybes :: [Maybe a] -> [a] vom Data.Maybe Modul verwenden, um die Nothing s zu verwerfen, und entfernen Sie die Just Umhüllungen, um die Liste in eine Liste von Zahlen drehen, die dann wie üblich gehandhabt werden können:

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

Eine weitere Alternative: Definieren Sie Ihr eigenes Prädikat auf 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] 

Noch besser: definieren pmaybe verwenden, wie Zeta suggests.

Noch eine weitere Alternative, mit einer Liste Verständnis und and:

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

Ist es möglich, etwas zu tun, wie 'alle (> = Nur 1 && <= Nur 9) [Nur 3, Nur 6, Nichts, Nichts, Nur 7] ' Dies scheint nicht auf Prelude zu arbeiten. – 0248881

+1

Sie können 'all (\ x -> x> = Nur 1 && x <= Nur 9) ...' verwenden, aber denken Sie daran, dass 'Nothing' am wenigsten ist, also ist es nicht so nützlich. Verwende 'catMaybes', oder (besser) hebe das Prädikat mit' may' an, wie Zeta gezeigt hat: 'all (vielleicht True (\ x -> x> = 1 && x <= 9)) ...' – chi

+0

Danke! Es ist nützlich, weil ich einen Sudoku-Solver mache und es keine Nullen im Sudoku gibt! – 0248881

12

Sicher. maybe True (< 9). maybe default func verwendet die gegebene Funktion func wenn Sie Just oder die default wenn Sie Nothing:

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

können Sie verwenden, Ihre allMaybe Funktion zu schreiben:

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

Oder wir könnten „Lift“ Ihre Prädikat zu 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) 

Aber das nur h ides der zugrunde liegende maybe weg.

+0

Das Prädikat mit 'vielleicht' anzuheben wäre in der Tat der beste Ansatz, IMO. – chi

13

Eine etwas ausgefallenere Lösung als die von chi und Zeta wäre Compose mit, so dass all die beiden Schichten als eine einzige Struktur, die Zahlen sehen:

GHCi> import Data.Functor.Compose 
GHCi> all (<=9) $ Compose [Just 3, Just 6, Nothing, Nothing, Just 7] 
True 
Verwandte Themen