문제

보고:

member this.PostAndReply : (AsyncReplyChannel<'Reply> -> 'Msg) * ?int -> 'Reply

서명이 왜 그렇게 반직관적으로 보이는지 알 수 없습니다.우리가 원하는 것은 에이전트에게 메시지를 게시하고 응답을 기다리는 것입니다.왜 우리는 그에게 '메시지'라는 이상한 기능을 주어야 하는가?

이 MSDN 조각을 다시 참조하세요.

let rec loop() =
    printf "> "
    let input = Console.ReadLine()
    printThreadId("Console loop")
    let reply = agent.PostAndReply(fun replyChannel -> input, replyChannel)
    if (reply <> "Stopping.") then
        printfn "Reply: %s" reply
       loop()
    else
        ()
loop()

나는 다음과 같은 것을 선호합니다.

member this.PostAndReply : 'Msg * ?int -> 'Reply

감사해요

도움이 되었습니까?

해결책

이 유형 서명은 처음 볼 때 꽤 혼란스러워 보이지만 의미는 있습니다.

F# 라이브러리 디자인
그 뒤에 숨은 아이디어는 당신이 전화할 때 PostAndReply 당신은 그것을 주어야합니다 기능 저것:

  • 유형의 메시지를 구성합니다. 'Msg (대리인에게 전송됩니다)
  • F# 런타임이 호출자에게 메시지를 다시 보내기 위한 채널을 구축한 후(채널은 형식의 값으로 표시됨) AsyncReplyChannel<'Reply>).

구성하는 메시지에는 응답 채널이 포함되어야 하지만 F# 라이브러리는 메시지를 표현하려는 방법을 알지 못합니다. 따라서 메시지에 응답 채널을 저장하려는 방법도 모릅니다.결과적으로 라이브러리는 시스템이 채널을 구성한 후 에이전트에 대한 메시지를 구성할 함수를 작성하도록 요청합니다.

대체 제안
귀하의 제안에 문제가 있는 경우는 다음과 같습니다. PostAndReply 종류가 있었어요 'Msg -> 'Reply, 상담원이 통화 후 받는 메시지 Receive 다음과 같은 유형이 될 것입니다:

'Msg * AsyncReplyChannel<'Reply>

...따라서 에이전트에게 수신된 모든 메시지에는 응답을 다시 보내기 위한 채널도 포함되어야 합니다.그러나 수신된 모든 메시지에 대해 답장을 보내고 싶지 않을 수도 있으므로 실제로는 작동하지 않습니다.어쩌면 다음과 같은 것을 사용할 수도 있습니다:

'Msg * option<AsyncReplyChannel<'Reply>>

...하지만 그건 점점 더 복잡해지고 있습니다(그리고 여전히 옳지 않습니다. 왜냐하면 다음의 일부 메시지에만 답장할 수 있기 때문입니다). 'Msg, 그러나 모두는 아닙니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top