我有点像Haskell新手。假设我有两个无限的数字列表A
和B
,我想创建另一个无限列表C
它包含一个x+y
和x-y
的序列,其中x <- A
和y <- B
,即C
在每个循环中增长2;最聪明的方法是什么?
制作一个无限的双元素列表并将它们连接起来。
concat [[x+y, x-y] | (x, y) <- zip listA listB]
您可能不想要最聪明的方法,因为根据定义,调试对您来说太聪明了:-)
一个明显的方法是将无限流压缩在一起,如下所示:
zipWith k as bs
where
k a b = (a + b, a - b)
对于无限列表,它只是
mkList (x:xs) (y:ys) = x+y : x-y : mkList xs ys
为了支持有限列表,你必须添加基本情况
mkList _ _ = []
f xs = concat . zipWith go xs where
go x y = map (($y).($x)) [(+),(-)]