【问题标题】:Haskell, sum up two elements of a list with pattern matching?Haskell,用模式匹配总结列表的两个元素?
【发布时间】:2016-05-03 20:25:59
【问题描述】:

我正在学习 Haskell 中的模式语法,现在我的小函数有问题。

我想像示例中一样添加列表的两个元素:

input 1: [1,2,3,4,5],  output2: [3,5,7,9]

input 2: [1,2,3,4,5,6],  ouput 2: [3,5,7,11]

我的代码(我试图为两个元素制作一个图案,但它说图案是重叠的):

g4 [] = []
g4 [x] = [] 
-- g4 (x:y:xs) = x+y: g4 xs
g4 (x:y:z:xs) = x+y:y+z: g4 (xs)

它应该看起来像这样,但我不知道如何为 2 个元素创建模式:

g1 [1,2,3,4,5]
 = 1+2 : 2+3 : g1 [3,4,5]
          = 3+4 : 4+5 : g1 [5]
               = []


g1 [1,2,3,4,5,6]
 = 1+2 : 2+3 : g1 [3,4,5,6]
          = 3+4 : 4+5 : g1 [5,6]  
                = 5+6

测试:

*Main> g4 [1,2,3]
[3,5] -- worked
*Main> g4 [1,2,3,4]
[3,5,4] -- did not work
*Main> g4 [1,2,3,4,5]
*** Exception: Test.hs:(127,1)-(130,32): Non-exhaustive patterns in function g4 -- didnt work

[3,5*Main> g4 [1,2,3,4,5,6]
[3,5,9,11] -- worked

【问题讨论】:

    标签: list haskell pattern-matching


    【解决方案1】:

    您可以在 (y:xs) 的组合上为您的递归组件调用 g4

    g4 [] = []
    g4 [x] = []
    g4 (x:y:xs) = x+y : g4 (y:xs)
    

    【讨论】:

    • 它有效,但你为什么使用 g4(y:xs) 而不是 g4(xs)?
    • [1,2,3,4] 为例,流程如下所示:g4 (1:2:[3,4]) = 1+2 : g4 (2:[3,4])g4 (2:3:[4]) = 2+3 : g4 (3:[4])g4 (3:4:[]) = 3+4 : g4 (4:[])g4 [4] = []。将这些组合在一起,您将得到[1+2, 2+3, 3+4]
    • 啊现在我明白了!这就是详细的答案!
    【解决方案2】:

    您可以使用“移位”版本的列表压缩列表。

    g4 xs = zipWith (+) xs (tail xs)
    

    【讨论】:

      猜你喜欢
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      • 1970-01-01
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      相关资源
      最近更新 更多