Soweit ich sehen kann, ist die Verwendung verschachtelter Listen hier unnötig. Ohne sie alles, was Sie brauchen, ist zipWith
und eine geeignete Kombination von Funktion:
-- The first argument is the "dead" value. Note that this works with any type.
makeDead :: a -> Bool -> a -> a
makeDead dead b val
| b = val
| otherwise = dead
GHCi> :t zipWith
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
GHCi> zipWith (makeDead "Dead") [True,False,True,False] ["Bob","Rick","Lee","Bill"]
["Bob","Dead","Lee","Dead"]
Zwei Variationen über das Thema. Erstens, wenn, ob ein Wert geändert wird nur der Wert ist auf das, was abhängig sein sollte, dann können Sie einfach map
/fmap
verwenden:
-- Affects all names with 'i' as the second letter:
lethalLetter :: String -> String
lethalLetter name -> case name of
(_:'i':_) -> "Dead"
_ -> name
GHCi> fmap lethalLetter ["Bob", "Rick", "Lee", "Bill"]
["Bob","Dead","Lee","Dead"]
Zweitens, könnten Sie mit Maybe
bevorzugen Leblosigkeit, um anzuzeigen, anstatt einen beliebigen Wert verwenden (was ist, wenn jemand tatsächlich "Dead" genannt wird)?
makeDead' :: Bool -> a -> Maybe a
makeDead' b val
| b = Just val
| otherwise = Nothing
GHCi> zipWith makeDead' [True,False,True,False] ["Bob","Rick","Lee","Bill"]
[Just "Bob",Nothing,Just "Lee",Nothing]
können Sie dann Funktionen wie maybe
, fromMaybe
und catMaybes
(die beiden letzteren sind in Data.Maybe
) der Nothing
s loszuwerden, aber Sie wie es zu tun fühlen:
GHCi> import Data.Maybe
GHCi> foo = zipWith makeDead' [True,False,True,False] ["Bob","Rick","Lee","Bill"]
GHCi> catMaybes foo
["Bob","Lee"]
Gibt es einen bestimmten Grund, warum dies Listen von Listen sind, da in Ihrem Beispiel alle inneren Listen nur ein Element haben? – duplode
zu erleichtern es zu lesen, ich denke, aber yeah sie können mehr als 1 Element haben – SlippyJoe
Das Lesen zu erleichtern ist kein guter Grund für die Verwendung verschachtelter Listen, da es alles viel komplizierter als nötig macht - Sie müssten entscheiden was mit den anderen Elementen zu tun ist. – duplode