【问题标题】:Convert a list to individual parameters将列表转换为单个参数
【发布时间】:2015-11-29 06:03:11
【问题描述】:

我有一个函数triple_count,它计算 3 个整数的总和。我正在尝试使用此函数构造一个新函数,该函数接受一个整数输入列表并返回一个总和列表。

最初我尝试过:

triples :: [Int] -> [Int]
triples xs
  | length xs < 3 = []
  | otherwise = triple_count (take 3 xs) : triples (drop 3 xs)

失败是因为三重计数的签名是Int -&gt; Int -&gt; Int -&gt; [Int] 而不是[Int] -&gt; [Int]

感谢SOHoogle 我能够使用!! 完成这项工作。

triples :: [Int] -> [Int]
triples xs
  | length xs < 3 = []
  | otherwise = (triple_count p1 p2 p3) : triples (drop 3 xs)
  where params = take 3 xs
        p1     = params !! 0 
        p2     = params !! 1 
        p3     = params !! 2

除了单独调用它们之外,是否有更好/更通用的方法将列表拆分为单个参数?

【问题讨论】:

    标签: haskell


    【解决方案1】:

    除了单独调用它们之外,是否有更好/更通用的方法将列表拆分为单个参数?

    一个更易读的可能是:

    triples :: [Int] -> [Int]
    triples (a:b:c:rest) = triple_count a b c: triples rest
    triples            _ = []
    

    【讨论】:

    • 更简单,更易读。我没有意识到: 可以像模式匹配那样被链接起来。
    • 这个解决方案,恕我直言,大大优于原始代码。更高效:1)它不会扫描整个列表,只计算它的长度; 2)它避免了慢索引!! n(需要遵循n指针)。也更安全:!! 2 如果列表太短,可能会使整个程序崩溃(!)——代码事先正确检查,但很容易忘记检查/执行错误检查;相反(详尽的)模式匹配永远不会导致崩溃。
    • @Greg 这只是一个嵌套模式,就像例如foo (x, 0) = xbar ((Just 0, n):mns) = ...
    • @jberryman,我发布的代码是学习更多关于语言的练习的一部分。我已经将类似的嵌套模式替换到一些早期的学习工作中,并且非常清楚地说明了一些事情。感谢您的额外说明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 2014-01-21
    相关资源
    最近更新 更多