2012-02-09 72 views
0

所以我通過一些樣品的F#代碼的工作,跑到下面的代碼片段:類型約束不匹配默認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#文件,但無法編譯 – 2012-02-09 05:18:13

回答

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'之間使用逗號,代碼也完美編譯,但會導致意想不到的結果。 – 2012-02-09 11:22:04

+3

逗號創建元組,圓括號組合在一起控制元組的內容。如果您在3和5之間放置逗號,代碼會編譯,因爲您創建了「(int - > int * int)* int'的元組,這是完全有效的,但可能不是您想要的。你可以看到這個,當用逗號在3和5之間運行代碼時運行你看''(Program + clo @ 7,3)''打印到控制檯。 – Robert 2012-02-09 12:01:55

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))