2014-12-16 11 views
1

Lwt_main.run()을 사용할 때 몇 가지 오류가 발생했습니다. 기본적으로 두 개의 무한 루프가 unit -> 'a Lwt.t = <fun>이고 두 루프를 모두 시작할 때 오류가 발생합니다. 나는 하나의 루프가 작가 루프이고 다른 하나는 리더 루프라는 맥락에서 이들을 사용하고있다. 기본적으로 필자는 독자와 함께 사용하는 것보다 훨씬 자주 필자와 데이터를 업데이트해야합니다. 받은 오류는 아래 코드로 설명 할 수 있습니다.Lwt_main.run()의 올바른 사용

let rec p1() = 
Lwt_io.print "1\n" 
>>= fun() -> Lwt_unix.sleep 1.0 
>>= p1 
;; 

val p1 : unit -> 'a Lwt.t = <fun> 

let rec p5() = 
Lwt_io.print "5\n" 
>>= fun() -> Lwt_unix.sleep 5.0 
>>= p5 
;; 

val p5 : unit -> 'a Lwt.t = <fun> 

Lwt_main.run(p1(); p5());; 

Characters 13-17: 
Warning 10: this expression should have type unit. 
Characters 13-17: 
Warning 10: this expression should have type unit. 

나는대로 오류없이 다음에 Lwt_main.run 문을 실행할 수 있지만,이 솔루션이 바로 와일드 카드로 경고를 마스킹 대신 경고를 고정 것 같다.

let _ = Lwt_main.run(p1()) 
let _ = Lwt_main.run(p5()) 

이러한 맥락에서 Lwt_main.run()의 적절한 사용 나는 오류를 수정하는 대신 바로 와일드 카드 문자로 마스킹 할 수 있도록 무엇입니까?

답변

4

우선 오류는 아니지만 경고입니다. ;로 끝나는 식의 예상 값이 unit 인 값으로 평가되지 않는다고 나와 있습니다. 귀하의 경우에는 동일한 유형으로 평가되는 unit Lwt.tp5()으로 평가되는 두 가지 표현식 p1()이 있습니다. 분명히 유형이 unit이 아니므로 ;p1() 또는 p5() 뒤에 넣을 수 없습니다. 둘 다 라이트급 스레드가, 그리고 당신이 (나는 생각한다) 원하는 것은 병렬로 실행하는 것입니다 때문에, 당신은 Lwt.pick 기능을 사용할 필요가, 또는 중위 해당 <&> : 한편

let() = Lwt_main.run (p1() <&> p5()) 

, 경우 이 스레드를 직렬화하려고합니다. 즉, 병렬로 실행하지 않고 하나씩 실행하려면 >>= 조작을 사용하여 바인드해야합니다. 구문 지원을 사용 가능하게 설정 한 경우 >> 구문을 사용할 수 있습니다. 실제로는 모다 딕을 나타냅니다. 세미콜론.