2016-12-05 5 views
0

프로그래밍 수정 중에 언어 시험, 표준 ML 섹션에 대한 몇 가지 유형 유추 질문이 있습니다, 나는 내 머리 속에서 타입 유추를함으로써 대부분을 할 수 있습니다. 그러나 나는 그것에 능숙합니다. 그러나 저를 떠난 하나의 질문이 있습니다.Standard ML에서 ('a -> ('b -> 'c)) -> ('a -> 'b) -> ('a -> 'c)의 함수

I 형의 함수 작성해야 :

('A -> ('B -> 'c)) -> ('A -> 'b) -> ('A ->을 'c)

그래서 내 머리에는 함수 f와 g 인 두 개의 인수가있는 함수가 있어야합니다. 둘 다 인수 x를 취할 것이지만이 인수 x는이 인수에 두 개의 인수 만 필요하므로이 인수 x를이 함수에 추가 할 수 없으므로 파이프 라이닝 함수에 o 연산자를 사용하여이 함수를 작성해야합니다.

그래서 f는 인수를 취하여 함수를 반환합니다. g는 인수를 취하여 값을 반환합니다. 그러면 전체 함수가 값을 받아 값을 반환합니다.

나는 어떻게 그 규칙을 암시하기 위해 o 연산자 만 사용하여 f와 g를 적용 할 수 있는지 잘 모르겠습니다.

이 어떤 도움이 매우 감사하겠습니다 :) 감사, 인 Ciaran

이미 언급 한 바와 같이

답변

1

을, 당신은 두 개의 인수의 함수를 작성해야합니다

fun my_function f g = body 

f : 'a -> 'b -> 'cg : 'a -> 'bbody : 'a -> 'c. body 이후

'a -> 'c을 입력있다, 우리는 body''cx : 'a을 입력있다

body = fn x => body' 

로 쓸 수 있습니다.

관찰

, f x : 'b -> 'cg x : 'b이, 당신은 유형 'b -> 'c의 함수는 인수에 기능을 적용하여 유형 'c의 값을 구성하는 것은 쉽다 유형 'b의 값이있는 경우 : (f x) (g x)을.

위의 우리를 제공합니다 : 정의의 왼쪽에 x 이동, 대안

fun my_function f g = fn x => (f x) (g x) 

또는 우리가 얻을 : 그런데

fun my_function f g x = f x (g x) 

, 당신이 잘 알고있는 경우 combinatory logic이면 결과 함수가 S 연결자임을 나타냅니다.

+0

이것은 훌륭합니다! 감사합니다. 매우 유용하고이 질문에 대한 생각을 환기 시켰습니다. – user2930356

+0

도와 주셔서 감사합니다 :) –