我即将编写我的第一个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 [] [] = []
拜托,你能帮帮我吗?
答案 0 :(得分:2)
我没有可以使用的口译员,因为我和平常的计算机不同,但这里有一些代码:
mix :: [a] -> [a] -> [a]
mix (x:xs) (y:ys) = x : y : mix xs ys
mix x [] = x
mix [] y = y
编辑:我刚刚在网上对此进行了测试,我相信它有效。
答案 1 :(得分:1)
因此有两个函数transpose
和concat
。
-- 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]