【问题标题】:Haskell mix two listsHaskell 混合两个列表
【发布时间】:2017-01-12 02:35:04
【问题描述】:

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

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

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

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

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

我的开始

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

拜托,你能帮帮我吗?

【问题讨论】:

  • 你在正确的轨道上。当其中一个列表为空而另一个不是时会发生什么?
  • 你对l1l2做了什么?
  • 谢谢,我尝试了一下解决了 :)

标签: haskell


【解决方案1】:

我没有可用的解释器,因为我在与平常不同的计算机上,但这里有一些代码:

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

编辑:我刚刚在网上测试过,我相信它有效。

【讨论】:

  • 感谢亚历克斯经过一番尝试后得到了同样的结果。像魅力一样工作:)
  • 如果我的回答能解决你的问题,请投票给我!
  • 您可能还想只匹配第一个参数:mix (x:xs) ys = x:mix ys xs; mix [] ys = ys。这是我自己used a few times自己的一个可爱的把戏。
【解决方案2】:

所以有两个函数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]

【讨论】:

    猜你喜欢
    • 2011-04-25
    • 1970-01-01
    • 2018-06-27
    • 2019-04-27
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多