5

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
4

1 に答える 1