【问题标题】:Haskell - Use of Take and Drop to split a list into three partsHaskell - 使用 Take 和 Drop 将列表拆分为三个部分
【发布时间】:2016-07-12 00:17:49
【问题描述】:

所以我遇到了这个函数定义,它接受一个列表 (xs) 并将其拆分为三个部分作为输出。

问题是我很难理解它。我理解第一部分取列表中的 n (xs),其中 n 定义为将列表 (xs) 的长度除以 3。但在那之后我不确定完全确定发生了什么。

如果有人能指导我完成这个功能,那就太好了。

代码如下:

--SPLITS A LIST INTO THREE PARTS---------------------------------------------------------

split3 xs = (take n xs , take n (drop n xs) , drop (n*2) xs)
    where n = length xs `div` 3

【问题讨论】:

    标签: list haskell take function-definition


    【解决方案1】:

    第二部分删除第一个 n 元素并采用以下 n 元素。

    [------- n -------][------- n -------][------- n -------]
    ^                  ^
    dropped            taken by `take`    ^ dropped by `take`
    

    具体示例可以是[1,2,3]n == 1 的列表。

    take n (drop n xs)
    == take 1 (drop 1 [1,2,3])
    == take 1 [2,3]
    == 2
    

    第三部分下降了两次n 并采取了其余部分

    [----             2n            -----][---- n -----]
    ^                                     ^
    dropped                               taken by `drop`
    

    【讨论】:

    • 对不起,我仍然不明白,在您的 [1,2,3] 示例中,您首先从列表中删除 1,然后从该列表中取出 1。我不明白这是如何工作的。您的意思是从列表中直接获取第 1 个元素还是从列表中获取任何单个元素?同样上线 == take 1 [2,3] 为什么结果只是2?
    • 我也可以对这句话有更详细的解释“第二部分删除前n个元素并采用以下n个元素。”这真的让我很困惑。
    • @GR412 take 1 是一个从前面获取一个元素的函数,而不是元素1!考虑take 2 ['a', 'b', 'c] == ['a', 'b']。因此,这句话仅仅意味着 take 在这种情况下被调用到一个列表上,当您获取原始列表并从中删除 n 的第一个元素时,您将获得该列表。然而,剩下的“尾巴”有 2n 个元素,第二个 1/3 和第三个 1/3,所以只取 n 就可以得到实际的中间部分。
    猜你喜欢
    • 2019-06-05
    • 2012-02-09
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 2014-07-25
    • 1970-01-01
    相关资源
    最近更新 更多