Я не совсем уверен, что моя номенклатура здесь правильная, но мне было интересно, была ли в Haskell функция zip, которая была жадной. Это означает, что если бы я имел
a = [1, 2, 3]
b = [4, 5]
zip' a b
#=> [(Just 1, Just 4),(Just 2, Just 5),(Just 3, Nothing)]
... где zip'
- это жадная функция zip, она вернет список кортежей длины более длинного списка и где более длинный список имеет элемент, но более короткий список не помещается Nothing
в соответствующей позиции кортежа. Я не спрашиваю, как писать это, но вместо этого задавался вопросом, существует ли это как встроенный.
Вот моя реализация (которая, вероятно, невелика)
zip' :: [a] -> [b] -> [(Maybe a, Maybe b)]
zip' (a:xs) [] = (Just a, Nothing) : zip' xs []
zip' [] (b:ys) = (Nothing, Just b) : zip' [] ys
zip' [] _ = []
zip' (a:xs) (b:ys) = (Just a, Just b) : zip' xs ys