Ich versuche, eine Funktion zu schreiben, die zip ähnelt, aber keine zusätzlichen Elemente verwerfen wird. Ich habe das Gefühl, irgendwo einen wirklich dummen Fehler gemacht zu haben.Was ist los mit meiner veränderten Version von zip?
Beispiel Eingabe:
zipMaybe [1,2,3] [1,2]
gewünschte Ausgabe:
[(Just 1, Just 1), (Just 2, Just 2), (Just 3, Nothing)]
zipMaybe :: [a] -> [b] -> [(Maybe a, Maybe b)]
zipMaybe (a:as) (b:bs) = (Just a, Just b) : zip as bs -- line with error
zipMaybe (a:as) [] = (Just a, Nothing) : zip as []
zipMaybe [] (b:bs) = (Nothing, Just b) : zip [] bs
zipMaybe _ _ = []
Dies wird jedoch nicht kompilieren.
Test.hs:2:49:
Couldn't match type `a' with `Maybe a'
`a' is a rigid type variable bound by
the type signature for
zipMaybe :: [a] -> [b] -> [(Maybe a, Maybe b)]
at Test.hs:1:13
Expected type: [Maybe a]
Actual type: [a]
In the first argument of `zip', namely `as'
In the second argument of `(:)', namely `zip as bs'
In the expression: (Just a, Just b) : zip as bs
Du nennst 'zip' statt Ihrer' zipMaybe' rekursiv aufrufen. – Tarmil
Vielleicht gefällt Ihnen ['align'] (http://hackage.haskell.org/package/these-0.3/docs/Data-Align.html). –
@DanielWagner danke, 'padAlign' macht genau das, wonach ich suche. – mcjohnalds45