2013-08-14 2 views
2

moscow ml에서 두 개의 함수 (둘 다 실수 형)를 빼기 위해 노력하고 있습니다. 그것은 다음 "오버로드 말한다 - 타입 실제의 인수에 적용 할 수 없습니다 -.?> 진짜 그래서 내가 어떻게 당신은 아마 실제로 서로 하나 개의 기능을 빼기하지 않으유형이 실수 (실수) 인 코드

fun CircleArea x = x*x*Math.pi 

fun SquareArea x:real = 4*x*x 

fun Area x = SquareArea - CircleArea 

답변

5

기능을 쓸 수 있지만 반환한다 .가 적용되면 이러한 기능의 값은 다음과 같은 방법으로이를 수 :

fun Area x = (SquareArea x) - (CircleArea x) 

기능 응용 프로그램 (SquareAreax 사이 즉 공간) 이진 연산자보다 긴밀한 결합 때문에 괄호는 필수하지 않습니다, -을 포함합니다.

ML에서 다음 명명 규칙을 사용하는 것이 좋습니다. 일반 함수는 소문자 시작 기호를 사용하고 대수 형식의 값 생성자는 대문자 시작 기호를 사용합니다.

fun area x = squareArea x - circleArea x 

:하지만 기능의

datatype shape = Square of int * int 
       | Circle of int 
1

뺄셈 우리가 수학에 내장 연산자로 제공되지 않습니다 가지고있는 것처럼 예를 들어. 그러나 자신을 정의 할 수는 있습니다.

수학적으로는, 우리가 정의 말하기 다음과 같이 우리는 SML이 정의를 복제 할 수 있습니다

(f - g)(x) = f(x) - g(x) 

: f -- g가 해당 기능을 생산하도록이 무엇

infix 5 -- 
fun f -- g = fn x => f x - g x 

는 운영자, --을 생산하고, 즉, x이 주어진 f x - g x 인 함수.

- 연산자의 형식 모호함으로 인해 기본값은 'a -> int 기능을 뺄 수 있습니다. 귀하의 경우에 당신은 'a -> real 기능을 빼야 할 것입니다, 그래서 당신은 약간의 수정이 필요합니다 :이 -- - 연산자를 사용하는 경우

infix 5 -- 
fun f -- g = fn x => f x - g x : real 

, 당신은 다음처럼 Area 함수를 정의 할 수 있습니다 :

val area = squareArea -- circleArea; 

(SML 명명 규칙과 일치하도록 함수 이름의 첫 문자를 소문자로 만들었습니다.)