Haskell混合了两个列表

时间:2017-01-11 15:57:58

标签: haskell

我即将编写我的第一个haskell程序,所以我需要你的帮助。我想要链接两个列表。例如;

a = [4,8,20]
b = [3,5,17,56,89,30]

interlink a b = [4,3,8,5,20,17,56,89,30]

结果列表必须交替包含List a和b的元素。如果一个List更长,那么在较短列表与较长列表的元素混淆之后,应将较长列表的元素添加到结果列表中。我想你在上面的例子中看到了这一点。

现在我如何在Haskell中做到这一点?

我的开始

mix :: [a]->[a]->[a]
mix (x:l1) (y:l2) = (x:y:[])
mix [] [] = []

拜托,你能帮帮我吗?

2 个答案:

答案 0 :(得分:2)

我没有可以使用的口译员,因为我和平常的计算机不同,但这里有一些代码:

mix :: [a] -> [a] -> [a]
mix (x:xs) (y:ys) = x : y : mix xs ys
mix x [] = x
mix [] y = y

编辑:我刚刚在网上对此进行了测试,我相信它有效。

答案 1 :(得分:1)

因此有两个函数transposeconcat

-- transpose :: [[a]] -> [[a]] 
-- concat :: Foldable t => t [a] -> [a]

由于List已经有一个Foldable实例,因此最终会出现一行代码:

concat . transpose $ a : b : []

concat . transpose  $ [a,b]

第一步是创建一个包含转置的列表列表

λ> transpose  $ [a, b]
[[4,3],[8,5],[20,17],[56],[89],[30]]

然后我们崩溃成一个。

这里的秘诀是使用功能组合。 .是一个函数,它接受两个函数并一个接一个地调用,从而创建一个更大的函数,所以:

(.) :: (b -> c) -> (a -> b) -> a -> c

表示:获取第一个函数transpose的结果,并将其提供给下一个函数concat

只要类型允许,我们就可以链接任意数量的函数。 在我们的例子中,合成创建了一个函数[a] -> [a] -> [a]