2016-04-21 99 views
2

我有這樣的代碼片段操作數類型不匹配

fun decrement_to_zero r = if !r < 0 
          then r := 0 
          else while !r >= 0 do r := !r - 1 

從本教程

https://learnxinyminutes.com/docs/standard-ml/

但我得到這個錯誤:

stdIn:1.2-33.9 Error: operator and operand don't agree [literal] 
    operator domain: int ref 
    operand:   int 
    in expression: 
    decrement_to_zero 10 

當我把它與

- decrement_to_zero 10;

爲什麼?

回答

3

Why?

如果檢查函數的類型簽名,

- decrement_to_zero; 
> val it = fn : int ref -> unit 

可以確認它的輸入類型不10 : int對齊。但是,如果你創建一個int ref

- val foo = ref 10; 
> val foo = ref 10 : int ref 

,並傳遞給你的函數,

- decrement_to_zero foo; 
> val it =() : unit 

,你會看到,參考已經更新,但不爲零,

- foo; 
> val it = ref ~1 : int ref 

所以這個函數的名字很差,而且寫得很差。自從我最初編寫它以來,該教程似乎出現了很多錯誤。

儘管標準ML支持引用,但編寫純函數通常更習慣於使用。純函數只將值作爲輸入並返回值作爲輸出,但不會影響函數以外的世界(例如參考foo在任何給定時間點指向的內容)。因此,例如,

fun actually_decrement_to_zero n = 
    if n > 0 then actually_decrement_to_zero (n-1) else n 

並使用此,

- actually_decrement_to_zero 10; 
> val it = 0 : int 

正如你所看到的,結果來到右出的功能,而不是間接地通過一個參考。

+0

儘管該功能的錯誤,它仍然像一個很好的小教程。 –

+0

謝謝!我從這些簡短的教程中學到了大量的編程知識。我沒有將引用作爲一個慎重的選擇,因爲我認爲它會以正確的方式教人們函數式編程,但我現在意識到,通過一個好例子來教好壞功能比壞例子更好。 ;-) –

相關問題