2016-12-02 68 views
1

我試圖創建一個程序,將總結大階乘的數字,這就是我在做什麼:SML - 錯誤:運營商是不是一個函數[tycon不匹配]

fun sumDigits n = 
    if n < 10 then n 
    else 
    n mod 10 + sumDigits(n div 10) 


fun factLarge 1 = IntInf.toLarge 1 
    | factLarge n = IntInf.toLarge n * factLarge(n-1) 


sumDigits (factLarge 100) 

但我在sumDigits (factLarge 100)上遇到錯誤,我不知道如何解決此問題。

20.sml:8.19-11.26錯誤:操作者不是一個函數[tycon失配] 操作者:IntInf.int 中表達: (factLarge(N - 1))sumDigits

回答

2

的特定錯誤是由於您必須將代碼粘貼到REPL中。它不知道factLarge的定義在哪裏結束。把一個分號該定義的末尾,這個錯誤就會消失(或者甚至更好使用命令use filename.sml;,而不是複製粘貼代碼):

fun sumDigits n = 
    if n < 10 then n 
    else 
    n mod 10 + sumDigits(n div 10); 

fun factLarge 1 = IntInf.toLarge 1 
    | factLarge n = IntInf.toLarge n * factLarge(n-1); 

sumDigits (factLarge 100); 

不幸的是,這一交易進行更深層次的錯誤膚淺的錯誤:

stdIn:40.1-40.26 Error: operator and operand don't agree [tycon mismatch] 
    operator domain: int 
    operand:   IntInf.int 
    in expression: 
    sumDigits (factLarge 100) 

的問題是,你的sumDigits期待一個int,而不是一個IntInf.int。 您必須在sumDigits的定義中加上適當的類型註釋才能正常工作。既然這似乎是功課,我會留給你去解決。

+0

用';'結束你的聲明的另一種方法是實際用'val ... ='開始你的值聲明。例如,如果你要在頂層運行一個函數,那麼'val it = sumDigits(factLarge 100)'。 –

+0

謝謝!我已經找到了如何以有效的方式更改sumDigits。 'fun sumDigits n = if n <10 then IntInf.toLarge n else n mod 10 + sumDigits(IntInf.toLarge(n div 10)); –