2010-12-07 4 views
2

의 연산 식에서 계산식을 좋아하지만 return 키워드 나!를 잊어 버리는 것과 같은 간단한 실수를 저질렀습니다. let과 같은 표현에! 그리고 돌아 오라!, 또는 나는 do를 쓰는 것을 잊어 버린다. 이것은 내가 상태에 대해 잊어 버리고 제가 정의한 모나드 연산자에만 집중하는 상태 모나드에서 많이 발생합니다.놓치기를 가장 잘 잡는 방법!, 할!, 돌아오고 돌아 오십시오! F #

때때로 모나드 연산자가 "익명"기능 대신 "모나드 유형"인 유형을 반환하는지 확인합니다. 이것은 내 건방진 타이핑을 추적하는 데 도움이되지만 아직 이상하지 않습니다. 누구 더 좋은 속임수가 있니?

+1

모나드 타입의 내부 상태를 캡슐화 (대신 일반 기능의 주위에 통과) 표준 관행은, 그것은 이런 종류의 오류를 피할 수 부분적으로 있기 때문이다. 이 접근 방식에 대해 맘에 들지 않는 점은 무엇입니까? –

+0

네 말이 맞다. 나는 "이상적이지 않다"고 말했다. 그러나 어쩌면 가능한 한 빨리 암묵적으로 잘못하도록 만드는 다른 방법은 없을 것이다. 나는 국가 모나드의 "알몸"기능 유형 서명과 같은 "일종의"이라고 생각합니다. 그러나 그것을 위로 감싼다. 감사. – user519985

답변

3

일반적인 모나드를 사용하면 키워드 뒤에 !이 누락되면 코드가 컴파일되어서 형식이 제대로 작동하지 않으므로 컴파일되지 않아야합니다. 예를 들면 :

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 
} 
+0

정확함, 누락은 컴파일러 오류를 발생시킵니다. 그러나 모나 딕 파서 (monadic parser)와 같은 코드를 사용하면 오류가 항상 눈에 띄게 붙지는 않습니다. 예를 들어! 돌아 오는 중!, 잘 돌아 오지만 원하는 것은 아닙니다. – user519985

+1

@ user519985 - 타입 어노테이션 추가는'return! '대신'return'을 사용하는 경우를 잡아야합니다. – kvb