有几次我发现自己希望在Haskell中使用zip
,它将填充添加到较短的列表中,而不是截断较长的填充。这很容易写。 (Monoid
对我的作品在这里,但你也可以只通过在要用于填充的元素。)试图定义zipPad3
时使用Haskell中的填充进行压缩
zipPad :: (Monoid a, Monoid b) => [a] -> [b] -> [(a, b)]
zipPad xs [] = zip xs (repeat mempty)
zipPad [] ys = zip (repeat mempty) ys
zipPad (x:xs) (y:ys) = (x, y) : zipPad xs ys
这种方法得到丑陋。我输入了以下内容,然后意识到,当然,这是行不通的:
zipPad3 :: (Monoid a, Monoid b, Monoid c) => [a] -> [b] -> [c] -> [(a, b, c)]
zipPad3 xs [] [] = zip3 xs (repeat mempty) (repeat mempty)
zipPad3 [] ys [] = zip3 (repeat mempty) ys (repeat mempty)
zipPad3 [] [] zs = zip3 (repeat mempty) (repeat mempty) zs
zipPad3 xs ys [] = zip3 xs ys (repeat mempty)
zipPad3 xs [] zs = zip3 xs (repeat mempty) zs
zipPad3 [] ys zs = zip3 (repeat mempty) ys zs
zipPad3 (x:xs) (y:ys) (z:zs) = (x, y, z) : zipPad3 xs ys zs
在这一点上我被骗了,只是用来length
挑选最长的名单和垫等。
我可以忽略一个更优雅的方式来做到这一点,或者像zipPad3
这样的东西已经定义在某个地方?