2016-12-02 24 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) 

問題は、あなたのsumDigitsint、ないIntInf.intを期待しているということです。 これが正しく動作するためには、sumDigitsの定義に適切な型注釈を付ける必要があります。これは宿題と思われるので、私はあなたのためにそれを残すでしょう。

+0

';'で宣言を終了する代わりに、 'val ... ='で値宣言を実際に開始することができます。たとえば、トップレベルで関数を実行する場合、 'val it = sumDigits(factLarge 100)'となります。 –

+0

ありがとうございます! sumDigitsをどのように変更するかは、動作する方法でわかりました。 'fun sumDigits n = n <10の場合IntInf.toLarge n else n mod 10 + sumDigits(IntInf.toLarge(n div 10));' –

関連する問題