[英]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] 但我不知道解決這個問題的過程。 幫助將不勝感激:)
foldr
的r
表示它是右結合折疊。
如果您不熟悉這個術語,結合性是運算符的一個屬性,它告訴我們如何解釋由不帶括號的運算符的順序應用組成的歧義表達式。 通過指定運算符的結合性,我們通過指定應評估表達式的結尾(因此使用right和left )來解決歧義。
例如,我們應該如何解釋以下表達式?
1 / 2 / 3 / 4
答案取決於運算符/
。 如果運算符是左結合的,答案是:
((1 / 2) / 3) / 4
另一方面,右結合/
將評估為:
1 / (2 / (3 / 4)))
折疊本質上是一種通過在序列的元素之間散布運算符來形成此類表達式的方式。 但是,由於關聯性,顯然有兩種同樣有意義的方法來執行此操作,即foldr
和foldl
。
將此應用於元組的最后一個元素(為簡潔起見,將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.