2017-01-12 11 views
2

SML NJ에서 조작 된 람다 식을 사용하려고하는데 어떤 이유로 오류가 발생합니다. 내 "program.sml"의 코드 :부분 함수 응용 프로그램에서 구문 오류가 발생했습니다.

fun add x y = x + y; // (x. y. A x y) 
fun plus = add 1; // (x. y. A x y) 1 --> (y. A 1 y) -(e.g.)plus 4=5 

오류 우분투 터미널에서 명령을 '사용'program.sml "후 : 그렇지 않은 경우가 있기 때문에

program.sml:2.5-2.9 Error: can't find function arguments in clause 
uncaught exception Error 
raised at: ../compiler/TopLevel/interact/evalloop.sml:66.19-66.27 
     ../compiler/TopLevel/interact/evalloop.sml:44.55 
     ../compiler/TopLevel/interact/evalloop.sml:292.17-292.20 

그것은"플러스 "라인은, 확실히이다 오류 없음. 그리고 나는 '재미있는 플러스 = (1을 더하십시오);' (괄호), 같은 오류가 발생합니다. 아마도 패키지가 누락 된 것 같은데요. 아무도 그것을 설명 할 수 있습니까?

+0

입력에 1을 더하는 함수는 'incr'또는 'succ'라고 할 수 있습니다. –

답변

3

. 그 형태는 입력으로 int 소요 고차 함수 인 것을 의미하고, 함수의 출력으로서 int -> int를 반환

fn: int -> int -> int 

이다.

이제 이 함수를 사용하여 plus (이 경우 자체적으로 고유 한 기능인 새로운 값)을 정의해야합니다. (@jacobm 이미 지적한 바와 같이)

따라서 단순히 사용

val plus = add 1; 

신비감는 SML 함수의 "일류 값"이라는 것이다. 외에도 을 사용하여 최상위 수준에서을 정의하면 자유롭게 생성하여 일반 값으로 전달할 수 있습니다. 카레 드 양식 (정의한 방법 add)으로 함수를 정의하는 이유 중 하나는이를 명시 적으로 정의하지 않고 필요한대로 함수를 작성하는 데 사용할 수있는 함수 팩터 리로 사용할 수 있다는 것입니다.

그런데 질문의 제목은 다소 오해의 소지가 있습니다. SML에서 "lambda expression"이라는 문구는 일반적으로 fn을 사용하여 생성 된 익명 함수를 위해 예약되어 있습니다. λ 계산 구문 x.은 SML에서 fn x =>과 동일합니다. 당신이 add를 정의하고 싶다면 명시 적으로 람다 식으로 다음을 사용 : 람다 표현식을 정의하는 키워드 fun 필요하지 않습니다

val add = fn x => fn y => x + y; 

하는 것으로.

4

val plus 아니요, fun plus이 아닙니다. fun plus은 함수의 본문을 제공하여 함수를 정의하는 특수 구문입니다. val plus은 "오른쪽에있는 이름으로 plus의 이름을 정의하십시오"라는 의미입니다.이 경우에는 함수가됩니다.

fun add x y= x + y; 

당신이 (제대로) 함수를 정의와