2012-02-09 45 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))