2012-02-09 18 views
0

だから私はいくつかのサンプルF#コードを通じて作業、および以下の断片に走ったよ:私はそれをコンパイルしようとするとデフォルトにint * int型部門とタイプ制約の不一致

let divRem a b = 
    let x = a/b 
    let y = a % b 
    (x,y) 

、私は次のエラーを取得します:

HelloWorld\Program.fs(15,14): error FS0071: Type constraint mismatch when applying the default type 'int * int' for a type inference variable. The type '(int * int)' does not support any operators named '/' Consider adding further type constraints

しかし、

let print n = System.Console.WriteLine(n.ToString()) 
print (4/2) 

結果のようなものをやって

2

整数除算演算が関数定義内で使用できないのはなぜですか?

編集: ここでは、コンパイルに失敗したコードのサンプル全体を示します。

let divRem a b = 
    let x = a/b 
    let y = a % b 
    (x,y) 

let print n = System.Console.WriteLine(n.ToString()) 
print (divRem (5,3)) 
+0

行番号によって推測この機能を使用するとき、実際のエラーです。コンパイルに失敗したF#ファイル全体を投稿してください。 –

答えて

7

F#で関数を呼び出すときにカンマを使用しないでください。カンマを使用してタプルを作成します。コードは次のようになります

let divRem a b = 
    let x = a/b 
    let y = a % b 
    (x,y) 

let print n = System.Console.WriteLine(n.ToString()) 
print (divRem 5 3) 
+0

実際、これらはカンマではなく丸括弧で、ここでタプルを指定しています。コードは '5'と' 3'の間にコンマを入れても完全にコンパイルされますが、予期せぬ結果につながります。 –

+3

コンマはタプルを作成し、タプルの内容を制御するためにカッコをグループ化します。完全に有効ですが、おそらくあなたが望むものではない ''(int - > int * int)* int''のタプルを作成するので、コードは3〜5の間にコンマを置くとコンパイルされます。これは、3から5の間のカンマでコードを実行すると、 ''(Program + clo @ 7、3) ''がコンソールに表示されるのと同じように見えます。 – Robert

0
let divRem (a, b) = 
    let x = a/b 
    let y = a % b 
    (x,y) 

let print n = System.Console.WriteLine(n.ToString()) 
print (divRem (5,3)) 
関連する問題