很好,這是用foldr的過濾器功能的定義:我是否使用關於foldr方面的過濾器定義的聲音等式推理?
myFilter p xs = foldr step [] xs
where step x ys | p x = x : ys
| otherwise = ys
因此,例如,比方說,我有這樣的功能:
myFilter odd [1,2,3,4]
所以這將是:
foldr step [] [1,2,3,4]
,這將是
step 1 (foldr step [] [2,3,4])
,這將是
step 1 (step 2 (foldr step [] [3,4]))
,這將是
step 1 (step 2 (step 3 (foldr step [] [4])))
,這將是
step 1 (step 2 (step 3 (step 4 (foldr step [] []))))
和foldr step [] []
是[]
這樣:
step 1 (step 2 (step 3 (step 4 [])))
現在我們將實際進入step
函數。
這裏是myFilter
函數內部的step
定義,從上面:
step x ys | p x = x : ys
| otherwise = ys
另外,我提醒你,p
實際上是在我們的例子中odd
功能。
好,我們再次在這裏:
step 1 (step 2 (step 3 (step 4 [])))
和
在最內側step
x = 4
,並4
並不奇怪,所以我們返回ys
,這是[]
所以現在我們得到這個:
step 1 (step 2 (step 3 []))
現在,在最內層step
,x = 3
和3
是奇數,所以我們返回x:ys
,這是3 : []
,這是[3]
,現在我們得到:
step 1 (step 2 [3])
,現在,在內部step
, x = 2
和2
並不奇怪,所以我們返回ys
,這是[3]
,所以現在我們將得到:
step 1 [3]
現在, x = 1
和1
是奇數,所以我們返回x : ys
,這是1 : [3]
,這是[1,3]
。
結束:-)。
我對我的所有動作都適用嗎?
非常感謝:-)。
p.s. myFilter
的定義來自Real World Haskell的書,在第4章中。
感謝。 好吧,我在哈斯克爾很新手,所以我不知道哈斯克爾的所有「後臺」。我只需要知道它是否就是這樣。可能在本書後面的章節中,他們會討論你試圖在這裏教給我什麼(我需要閱讀更多,瞭解它) 非常感謝:-)。 – Elimelech 2010-02-02 16:45:11
我認爲你在正確的軌道上。我不會將這稱爲「後端」,理解懶惰評估如何工作。對於這樣一個簡單的例子來說,這並不重要,但是當你看到'foldr'在無限列表上運行並且'foldl'不能運行時,這將幫助你理解爲什麼。 – Dan 2010-02-02 19:23:12