假設foldTree、一個Tree和一個函式f的這些定義:
foldTree : (a -> [b] -> b) -> Tree a -> b
foldTree f = go
where
go (Node x ts) = f x (map go ts)
tree :: Tree String
樹 = 節點
"Alpha"/span>
[Node "Beta" [Node "Epsilon" [] 。Node "Zeta" [], Node "Eta" []] 。
, Node "Gamma" [Node "Theta" []] .
, Node "Delta" [Node "Iota" [ ] 。Node "Kappa" [], Node "Lambda" [].
]
f x xs = [x] <> (map (' ':) (concat xs))
我將嘗試評估foldTree f tree:
foldTree f tree
= go (Node "Alpha" [ Node "Beta" [Node "Epsilon" [] 。Node "Zeta" [], Node "Eta" [] ] 。Node "Gamma" [Node "Theta" [] ] 。Node "Delta" [Node "Iota" [ ] 。Node "Kappa" [], Node "Lambda" []] ]
= f "Alpha"/span> (map go [...])
...
在這一點上,我的問題是:等式推理是如何與閉包一起作業的?go的定義中有f;但是,這肯定不是在其引數之間。是否有一些技巧允許插入該定義呢?
uj5u.com熱心網友回復:
簡單地說,一個定義被允許參考任何在范圍內的名字。
"closures"是一個在有突變的情況下更為相關的概念。在沒有突變的 Haskell 中,"范圍" 的概念已經足夠了。
這個定義可以被改寫成 而任何呼叫 這些是簡單的嵌套的 為了更容易看到發生了什么,首先嘗試用一個更簡單的例子資料來評估它,比如go的定義被嵌套在foldTree的定義中,因此可以訪問其引數f。換句話說,在go的定義中,f是在范圍內。{-
foldTree f t = go t
其中
go (Node x ts) = f x (map go ts)
-}
foldTree f t =
let { go (Node x ts) = f x (map go ts) }
in go t
foldTree f1 t1被評估為> foldTree f1 t1
=>。
let { f=f1; t=t1 }
in
let { go (Node x ts) = f x (map go ts) }
in go t
=>。
....
lets,所以內部的那個可以訪問外部的那個所定義的每一個名字。
Node "Alpha" [], Node "Alpha" [Node "Beta" []],等等。
f0 x xs = [x] <> (map (' ':) (concat xs) )
對節點 "Alpha"[]的評估程序是
> foldTree f0 (Node "Alpha" [] )
=>
let { f=f0; t=Node "Alpha" [] }
in
let { go (Node x ts) = f x (map go ts) }
in go t
=>。
let { f x xs = [x] <> (map (' ':) (concat xs))
; go (Node x ts) = f x (map go ts)
}
in go (Node "Alpha" [] )
=>
let { f x xs = [x] <> (map (' ':) (concat xs))
; go (Node x ts) = f x (map go ts)
; (Node x1 ts1) = (Node "Alpha"/span> [] )
}
in f x1 (map go ts1)
=>
let { f x xs = [x] <> (map (' ':) (concat xs))
; go (Node x ts) = f x (map go ts)
; x1 = "Alpha"; ts1 = [].
; ts1 = [] 。
; xs1 = map go ts1
}
in [x1] <> (map (' ':) (concat xs1))
=>
["Alpha"] <> (map (' ':) (concat [] ))
=>
["Alpha"] <> (map (' ':) [])
=>
["Alpha"] <> [] 。
=>
["Alpha"] 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/316912.html
標籤:
