哈斯克尔的两个名单上的两个行动



我有点像Haskell新手。假设我有两个无限的数字列表AB,我想创建另一个无限列表C它包含一个x+yx-y的序列,其中x <- Ay <- 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)) [(+),(-)]

最新更新