2016-06-27 2 views
3
let (->>>) lst exp = for i in lst do exp 

let result = [0..5] ->>> ([1..5] ->>> printf "hi") 
let result2 = for i in [0..5] do for x in [1..5] do printf "hi" 

같은 것을하기 위해 과 result2이 필요했습니다. 그러나 결과는 한 번만 인사말을 인쇄합니다. 그러나 result2은 30 번 인쇄합니다. 여기서 누락 된 것은 무엇입니까?F # 중첩 과부하가 작동하지 않습니다.

답변

9

운영자 정의에서 exp은 반드시 기능 일 필요는 없습니다. 연산자를 정의한 방법은 exp입니다. 예를 들어, 당신이 할 수 있습니다 :

[0..1] ->>> 42 

이 실행도 컴파일 할 함수가되도록 exp 매개 변수를 필요로 운영자의 정의에 아무것도 없기 때문입니다. 또는 그 문제에 대한 다른 것.

exp을 반복 본문 내에서 반복하여 평가하려면 함수로 만들고 루프 본문에서 호출해야합니다. 요구 사항이 없으므로 가장 간단한 방법은 unit -> 'a입니다. 그들은 이렇게 표현 exp() 기능을 입력 unit의 값을 의미 - 괄호 exp

let (->>>) lst exp = for i in lst do exp() 

공지 사항 : 당신은 정말 당신이 그것의 사용에서 추론 컴파일러를 가질 수 있습니다,하지만 유형을 선언 할 필요가 없습니다 응용 프로그램 (예 : 기능 exp()에 적용).

printf "hi"은 기능이 아니기 때문에이 정의를 사용하면 [1..5] ->>> printf "hi"을 쓸 수 없습니다. 따라서 대신 다음을 작성해야합니다.

[1..5] ->>> (fun() -> printf "hi") 

이제 5 개의 "hi"가 인쇄됩니다.

이것은 for .. do 구문이 실제로 언어의 특수한 부분이며 표준 라이브러리에 정의 된 "다른 기능"이 아니기 때문입니다. 똑똑한 함수 나 연산자 정의로는 실제로 같은 효과를 낼 수 없습니다.

함수 및 연산자보다 복잡한 구문을 작성하려면 computation expressions을 확인하십시오.

+0

대단히 감사합니다. 이 답변은 잘 부탁드립니다. – ozgur

+0

좀더 현실적인 해결책은 람다가 요소를 받기 위해서입니다 :'... do exp i'. 이것은'printf "hi % d"'를 사용하는 것을 가능하게하고,'fun i ->'랩 어라운드가 필요하지 않습니다. – bytebuster

+0

그건 OP가 시도한 것이 아닙니다. –

관련 문제