2009-09-06 2 views
3
예를 들어

대신SML/NJ에서 이진 연산자의 Curried 형식을 가져 오는 방법이 있습니까?

- op =; 
val it = fn : ''a * ''a -> bool 

의 차라리 분명히

val x = getX() 
val l = getList() 
val l' = if List.exists ((op =) x) l then l else x::l 

내가 예를 들어, 내 자신의에서이 작업을 수행 할 수 있습니다에서 사용하기에

- op =; 
val it = fn : ''a -> ''a -> bool 

있을 것입니다,

val l' = if List.exists (fn y => x = y) l then l else x::l 

하지만 나는 더 우아한 방법을 놓치지 않고 있는지 확인하고 싶습니다.

답변

5

당신은 함수 커링 도우미 함수 작성할 수

fun curry f x y = f (x, y) 

는 그런 다음

val curried_equals = curry (op =) 
val l' = if List.exists (curried_equals x) l then l else x::l 
+0

+1. 그리고 그 반대의 경우,'fun decler f (x, y) = f x y'라고 쓸 수 있습니다. (이것은 바이너리 함수를 기대하는'foldl'과 같은 함수를 호출 할 때 유용합니다.) – ruakh

2

SML에 대한 지식이 부족하지만 Ullman 서적을 살펴본 결과 터플을 카레 기능에 적용하는 쉬운 방법을 찾지 못했습니다. 그들은 서로 다른 두 가지 서명이 있고 서로 직접적으로 호환되지 않습니다.

나는 너 자신을 굴려야 할 것 같아.

하스켈로 전환하십시오.

편집 : 나는 그것에 대해 생각해 보았고, 이제는 왜 다른 하나와 같지 않은지를 알고 있습니다. SML에서는 하나의 매개 변수 만 실제로 사용하는 거의 모든 기능을 제공합니다. 대부분의 경우 실제로 하나 이상의 요소가 포함 된 튜플을 실제로 전달하는 경우가 발생합니다. 여전히 튜플은 단일 값이며 함수에 의해 처리됩니다. 이 함수는 부분 튜플을 전달할 수 없습니다. 그것은 전체 튜플이거나 아무것도 아닙니다.

둘 이상의 매개 변수를 허용하는 함수는 정의에 따라 카레트입니다. 여러 매개 변수를 허용하는 함수를 정의 할 때 (여러 요소가있는 단일 튜플이 아닌)이를 부분적으로 적용하고 리턴 값을 다른 함수의 인수로 사용할 수 있습니다.

+1

당신의 상태처럼 뭔가를 할 수 있습니다 "하나 개 이상의 매개 변수를 정의함으로써, 받아들이는 모든 함수, 카레 ". 글쎄, 타입 ('a ->'b -> 'c')의 함수가 단일 매개 변수 ('a')를 받아 들인다 고 생각합니다. 단지 타입 ('b ->'c). 이는 "->"연산자가 오른쪽 연관되어 있기 때문에 발생합니다 ('a ->'b -> c) = ('a -> ('b -> 'c)). 부분적인 적용은 그때의 결과 일뿐입니다. 함수 응용 프로그램은 왼쪽 연관이므로 (myFun arg1 arg2 arg3) = ((myFun arg1) arg2) arg3). – harms

관련 문제