我試圖編寫一個類似於zip的函數,但不會丟棄額外的元素。我覺得我在某個地方犯了一個非常愚蠢的錯誤。我的zip版本有什麼問題?
示例輸入:
zipMaybe [1,2,3] [1,2]
希望的輸出:
[(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 _ _ = []
然而這將不編譯。
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
你打電話'zip'而不是遞歸調用你的'zipMaybe'。 – Tarmil
你可能會喜歡['align'](http://hackage.haskell.org/package/these-0.3/docs/Data-Align.html)。 –
@DanielWagner謝謝,'padAlign'完全符合我的要求。 – mcjohnalds45