有幾次我發現自己希望在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
這樣的東西已經定義在某個地方?