일종의 모나드 법칙을 따르는 데이터 구조/계산 목록은 매우 풍부합니다.
선택적인 데이터 (F #에서 'a option
)를 넘는 목록부터 파서와 같이 매우 복잡한 항목까지 연속 및 멀티 스레딩에 이릅니다.
일부 구현하기 시작하십시오. 기본 exercies는 :
// Identity monad
let something = ident {
let! value = id 42
return value
}
let somethingelse = ident {
let! value = something
let! otherValues = id 40
return value + othervalue
}
// Implement maybe for 'a option
let sum = maybe {
let! a = maybeInputNumber("a")
let! b = maybeInputNumber("b")
let! c = maybeInputNumber("c")
return a + b + c
}
match sum with
| None -> ...
| Some(n) -> ...
또한 도우미 기능과 명시 적 모나드 구문으로 litte 비트를 재생하여 이해를 높일 수 있습니다. 당신은 몇 가지 복잡한 예를 원하는 경우에
// Given m >>= f for m.Bind(f)
let (>-) f monad = monad >>= (fun k -> return(f x))
// What's this?
let res = ((+) 1) >- [1..10]
는 monadic parser combinators를보십시오. 이것은 다음과 같은 유형에 대한 간단한 구현의 기반이
let parseVector = parser {
do! ignore $ char '('
let! [x;y;z] = sepBy parseNumber ","
do! ignore $ char ')'
return new Vector(x, y, z)
}
합니다 (FParsec - 프로젝트에서보세요) 당신이 일반 F #으로 복잡한 재귀 하강 파서를 구현 할 수 있습니다 :
type 't Computation =
| Error of ...
| Result of 't
type Input = char list
type 'a Parser = Input -> (('a * Input) Computation)
에 시도 바인드 및 수익을 구현 ;-)
그리고 일반적인 팁으로 : 당신이 정말로 그들의 자연 환경에서 모나드를 이해하려면 ' 하스켈을 사용해야합니다 ;-) F #에는 모호한 아날로그 계산식 만 있지만 하스켈은 모나드 계산을위한 일반 인터페이스를 도입했습니다. 그들을 시험해 보는 것은 완전하다!