gpt4 book ai didi

haskell - 在 Haskell 中使用填充进行压缩

转载 作者:行者123 更新时间:2023-12-03 15:23:02 25 4
gpt4 key购买 nike

有几次我发现自己想要一个 zip在 Haskell 中,它将填充添加到较短的列表中,而不是截断较长的列表。这很容易写。 ( Monoid 在这里为我工作,但您也可以只传递要用于填充的元素。)

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 时会变得很丑陋。 .我输入了以下内容,然后意识到它当然不起作用:
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已经在某个地方定义了?

最佳答案

定制怎么样headtail函数(在下面的示例中名为 nextrest)?

import Data.Monoid

zipPad :: (Monoid a, Monoid b) => [a] -> [b] -> [(a,b)]
zipPad [] [] = []
zipPad xs ys = (next xs, next ys) : zipPad (rest xs) (rest ys)

zipPad3 :: (Monoid a, Monoid b, Monoid c) => [a] -> [b] -> [c] -> [(a,b,c)]
zipPad3 [] [] [] = []
zipPad3 xs ys zs = (next xs, next ys, next zs) : zipPad3 (rest xs) (rest ys) (rest zs)

next :: (Monoid a) => [a] -> a
next [] = mempty
next xs = head xs

rest :: (Monoid a) => [a] -> [a]
rest [] = []
rest xs = tail xs

测试片段:
instance Monoid Int where
mempty = 0
mappend = (+)

main = do
print $ zipPad [1,2,3,4 :: Int] [1,2 :: Int]
print $ zipPad3 [1,2,3,4 :: Int] [9 :: Int] [1,2 :: Int]

它的输出:
[(1,1),(2,2),(3,0),(4,0)]
[(1,9,1),(2,0,2),(3,0,0),(4,0,0)]

关于haskell - 在 Haskell 中使用填充进行压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3015962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com