簡體   English   中英

在 elm/haskell 中使用 foldr

[英]using foldr in elm/haskell

我在使用 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] 但我不知道解決這個問題的過程。 幫助將不勝感激:)

foldrr表示它是右結合折疊。

如果您不熟悉這個術語,結合性是運算符的一個屬性,它告訴我們如何解釋由不帶括號的運算符的順序應用組成的歧義表達式。 通過指定運算符的結合性,我們通過指定應評估表達式的結尾(因此使用rightleft )來解決歧義。

例如,我們應該如何解釋以下表達式?

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

免責聲明:這是在 Haskell 中,我不知道a `f` b語法在 Elm 中是否有效,但它不會改變你只需要在任何地方編寫fab而不是a `f` b結果


q2一個組成部分(我將取最后一個 - 因為它是其中最短的):

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

每一步都只是使用你的定義

我希望你也能對其他情況做同樣的事情:D


請注意,我使用了簡單的替換技巧

  • :使用findSubsequences
  • [] with 0`findSubsequences`的第一個參數)

您將輸入列表表示為a:b:c:...:[]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM