2012-02-09 2 views
0

그래서 몇 가지 예제 F # 코드를 통해 작업, 다음과 같은 단편으로 실행 해요 :형 제약 불일치

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