在elm / haskell中使用foldr

时间:2015-10-31 19:22:06

标签: haskell fold elm

我在使用foldr解决此问题时遇到问题。我理解foldr的简单问题(如foldr(+)5 [1,2,3,4])但这更复杂:

问题:q2的价值是多少?

findSubsequence next highest = case next == highest + 1 of
  True -> next
  False -> highest

q2 = (foldr findSubsequence 0 [5,6,8,4,7,3,2,1,0,2,3,1,0]
     ,foldr findSubsequence 0 [0,1,3,2,0,1,2,3,7,4,8,6,5]
     ,foldr findSubsequence 0 [1,2,3,4,3,2,1]
     ,foldr findSubsequence 0 [4,3,2,1,2,3,4]
     )

为每个列表使用foldr为您提供值并将结果列表放在一起[5,3,4,4],但我不知道解决此问题的过程。帮助将不胜感激:))

2 个答案:

答案 0 :(得分:6)

r中的foldr表示它是右关联折叠。

如果您不熟悉该术语,关联性是运算符的一个属性,它告诉我们如何解释由运算符的顺序应用程序组成的不带括号的模糊表达式。通过指定运算符的关联性,我们通过指定应该从中计算表达式的结束来解决歧义(因此使用正确)。

作为一个例子,我们应该如何解释以下表达式?

1 / 2 / 3 / 4

答案取决于运营商/的相关性。如果运算符是左关联的,答案是:

((1 / 2) / 3) / 4

另一方面,右关联/将评估为:

1 / (2 / (3 / 4)))
实际上,折叠是通过在序列的元素之间散布运算符来形成这种表达式的一种方式。但是,由于相关性,显然有两种同样有意义的方法,导致foldrfoldl

将其应用于元组的最后一个元素(为简洁起见,将findSubsequence重命名为f)会导致:

foldr f 0 [4,3,2,1,2,3,4] = f 4 (f 3 (f 2 (f 1 (f 2 (f 3 (f 4 0))))))
                          = f 4 (f 3 (f 2 (f 1 (f 2 (f 3 0)))))
                          = f 4 (f 3 (f 2 (f 1 (f 2 0))))
                          = f 4 (f 3 (f 2 (f 1 0)))
                          = f 4 (f 3 (f 2 1))
                          = f 4 (f 3 2)
                          = f 4 3
                          = 4

答案 1 :(得分:3)

免责声明:这是在Haskell中,我不知道a `f` b语法在Elm中是否有效,但它不会改变你刚才写的结果{{1}而不是f a b哪里找到它

a `f` b的一个组成部分(我会选择最后一个 - 因为它是最短的组成部分):

q2

每个步骤只使用您的定义

我希望你能够对其他案例做同样的事情:D

不是我使用替换的简单技巧

  • foldr findSubsequences 0 [4,3,2,1,2,3,4] { with fSs = findSubsequences - note that [] is replaced with the 0 of the first arg } = 4 `fSs` (3 `fSs` (2 `fSs` (1 `fSs`(2 `fSs` (3 `fSs` (4 `fSs` 0)))))) { 4 is not 0+1 so 4 `fSs` 0 = 0 } = 4 `fSs` (3 `fSs` (2 `fSs` (1 `fSs`(2 `fSs` (3 `fSs` 0))))) { 3 is not 0+1 so 3 `fSs` 0 = 0 } = 4 `fSs` (3 `fSs` (2 `fSs` (1 `fSs`(2 `fSs` 0)))) { 2 is not 0+1 so 2 `fSs` 0 = 0 } = 4 `fSs` (3 `fSs` (2 `fSs` (1 `fSs`0))) { 1 IS 0+1 so 1 `fSs` 0 = 1 } = 4 `fSs` (3 `fSs` (2 `fSs` 1)) { 2 IS 1+1 so 2 `fSs` 1 = 2 } = 4 `fSs` (3 `fSs` 2) { 3 IS 2+1 so 3 `fSs` 2 = 3 } = 4 `fSs` 3 { 4 IS 3+1 so 4 `fSs` 3 = 4 } = 4 :
  • findSubsequences[]0的第一个参数)

您将输入列表表示为`findSubsequences`