2014-10-27 77 views
0

我似乎無法找到這個看似簡單的SML問題的簡單答案。我的代碼:函數中的ML變量

fun inde(x, y, L) = if null L then nil else 
    if x=hd(L) then y+1::inde(x,y+1,tl L) else 
    inde(x,y+1,tl L); 

我想Y中的功能之外的變量,因此這將是不知疲倦(X,L),但具有在y仍算正常。當我聲明它在函數之外(到0)時,遞歸調用函數時,它將重置爲0.

如果要運行此當前函數,它將生成一個x的位置在列表(L)。 因此inde(1,0,[1,2,2,1,1])會產生[1,4,5]

+0

標準ML中的變量是實際的數學變量,其含義由替換給出,而不是由一系列重新分配給出。 [來源](http://existentialtype.wordpress.com/2012/02/01/words-matter/)。這樣做的直接後果就是你無法修改變量在給定上下文中代表的值。 – pyon 2014-10-27 07:05:28

回答

1

使用函數式編程風格時的習慣結構是定義一個帶參數的內部函數那些感興趣的程序員,而不是用戶,然後調用main函數內部函數:

fun inde(x : int, L) = 
    let 
    fun inner(list1, list2, y : int) = 
     if null list1 
     then List.rev list2 
     else 
     if x = hd list1 
     then 
      inner(tl list1, y::list2, y + 1) 
     else 
      inner(tl list1, list2, y +1) 
    in 
     inner(L,[],1) 
    end 

在這個例子功能:

  • inner使用四個值:本地變量list1list2y。它也使用封閉範圍內的x

  • inner構建(conses up)將使用list2返回的列表。它從SML Basis Library撥打電話List.rev反轉列表。這將O(n)添加到執行時間。

  • let...in...end構造的最後一部分:inner(L,[],1)被稱爲「蹦牀」,因爲代碼一直到源文件的底部,然後反彈它開始執行。這是一個標準模式。

  • 請注意,我開始迭代y等於1,而不是0.從零開始沒有在原始文件中完成任何事情。

+0

'inner'的命名約定是什麼?我傾向於使用'有趣的bla ...讓bla_ ...在bla_ ...'我認爲有更好的方法,因爲這是Python的影響,顯然,我在用Python編程之前用ML編程。 – rudolfovic 2016-09-13 05:29:24

+0

@rudolfovic我將函數命名爲'inner',因爲我的答案說明了使用內部函數[請參閱我的答案的非代碼文本]。命名是Martin Fowler在計算機科學中的兩個難題之一。我並不是說'內在'是個好名字,但兩年後,我可以閱讀我的代碼並解釋爲什麼我將內部函數命名爲'內部'......以及爲什麼我將外部函數命名爲'inde'。所以如果有一個約定,它主要是爲人類閱讀而編寫的程序。祝你好運。 – 2016-09-13 14:43:18