일반적인 모나드를 사용하면 키워드 뒤에 !
이 누락되면 코드가 컴파일되어서 형식이 제대로 작동하지 않으므로 컴파일되지 않아야합니다. 예를 들면 :
let sum = async {
let x = async { return 1 }
let y = async { return 2 }
return x + y
}
두 Async<int>
의를 추가하려고하고 있기 때문에이 컴파일되지 않습니다,하지만 당신은 let!
들에 let
의를 변경하는 경우가 컴파일됩니다.
마찬가지로, return
의 누락 식별하기 위해, 단지 컴파일러 경고 메시지와 홀수 모나드 유형 피려 :이 경우
let sum = async {
let! x = async { return 1 }
let! y = async { return 2 }
x + y // warning FS0020
}
, sum
당신이 그것을 사용하려고하면 자명하다 Async<unit>
입니다 코드의 다른 부분. 양자 택일로, 당신은이 문제를 즉시 잡으려고 유형 약어를 사용할 수 있습니다
let sum : Async<int> = async { // error FS0001: type mismatch
let! x = async { return 1 }
let! y = async { return 2 }
x + y // warning FS0020
}
출처
2010-12-07 16:55:16
kvb
모나드 타입의 내부 상태를 캡슐화 (대신 일반 기능의 주위에 통과) 표준 관행은, 그것은 이런 종류의 오류를 피할 수 부분적으로 있기 때문이다. 이 접근 방식에 대해 맘에 들지 않는 점은 무엇입니까? –
네 말이 맞다. 나는 "이상적이지 않다"고 말했다. 그러나 어쩌면 가능한 한 빨리 암묵적으로 잘못하도록 만드는 다른 방법은 없을 것이다. 나는 국가 모나드의 "알몸"기능 유형 서명과 같은 "일종의"이라고 생각합니다. 그러나 그것을 위로 감싼다. 감사. – user519985