(嵌套函數(shù))Nested Functions
根據(jù)let表達式:let b1 b2 … bn in e end的使用規(guī)則,我們在其中定義任意綁定,包括function綁定,這是一種好的編程風(fēng)格。
實例
fun count (from : int, to : int) =
if from = to
then to :: []
else from :: cout(from+1, to)
fun countup_from0(x : int) =
count(1, x)
我們不想對外暴露輔助函數(shù)、或困擾別人時,我們就需要使用let以實現(xiàn)嵌套函數(shù)
fun countup_from1 (x : int) =
let fun count (from : int, to : int) =
if from = to
then to :: []
else from :: count(from+1,to)
in
count (1,x)
end
更好的版本:
fun countup_from1_better (x : int) =
let fun count (from : int) =
if from = x
then x :: []
else from :: count(from+1)
in
count 1
end
通過上面的例子,我們可以知道,嵌套函數(shù)可以使用其外層環(huán)境已定義的綁定,如:參數(shù)、在let表達式內(nèi)早于函數(shù)定義的綁定。
編程風(fēng)格
在函數(shù)內(nèi)部定義輔助函數(shù)是一種良好的編程風(fēng)格,如果輔助函數(shù):
- 輔助函數(shù)在其他地方不太可能會使用到
- 在其他地方可能會被濫用
- 以后可能被更改或刪除
代碼設(shè)計中的一個基本權(quán)衡:重用代碼可以節(jié)約時間和精力,并且可以避免一些錯誤,但是同時它也會導(dǎo)致重用的代碼在以后難以更改。