有三個類似(但不同)這裏定義的東西的方法:
可以某些定義後附加條款where
- 主要是方程式綁定。所以你可以在你的函數的末尾放置一個,或者在用let
或者周圍的where
子句定義的東西之後。
在另一方面,let x = ... in ...
是表達式計算結果爲部分in
後,這是唯一的地方let
後的東西是可見的。
在do
塊的內部,因爲已經有一個隱式的作用域嵌套(事先在第一次定義之後就可見),所以只能單獨使用let x = ...
。這與之前的表格完全相同--區塊的其餘部分實際上是in ...
部分。
如果你想使用該do
塊內定義一些本地定義,你唯一的選擇是第三(或通過其他值(S)作爲參數(S))。然而,對於像你的例子那樣的獨立幫助函數,任何樣式都可以。這裏是你的榜樣,證明每個:
的第一個樣式,其中func
可見在foo
任何地方,包括任何的where
條款中的其他規定:
foo = do ...
mapM_ func aList
...
return aValue
where func x = x + 1
第二種風格,其中func
是唯一可見的內的let
表達,在這種情況下是整個do
塊:
foo = let func x = x + 1
in do
...
mapM_ func aList
...
return aValue
而第三樣式,定義它在do
塊內。在這種情況下,func
僅在let
後纔可見;在第一個...
它尚未定義。
foo = do ...
let func x = x + 1
mapM_ func aList
...
return aValue
哦,好措施:由於let ... in ...
是一個表達式,你也可以使用它的任何地方,你有一個表達,說出一些地方的定義。因此,這裏是另一個例子:
foo = do ...
let func x = x + 1 in mapM_ func aList
...
return aValue
和以前一樣,func
只是let
表達,在這種情況下它後單表達,無處內可見。
謝謝。第三種形式看起來像它可以讓我定義足夠接近'mapM_'的lambda函數是有用的。我只擔心它會在'let'(小問題)中定義的名稱爲'func'的頂級函數名稱空間受到污染。 – Ralph
@Ralph:好吧,這只是你希望它顯示的範圍的問題。如果你的'do'塊足夠大,你需要擔心污染它裏面的命名空間,那麼你應該考慮把它分成更小的塊。 :] –
是的,這也發生在我身上。我正在翻譯一些功能比它們應該更長的功能的一些功能性的Scala代碼(一些白癡寫過(:-))。 – Ralph