Список структур данных / вычислений, которые следуют некоторому монадическому закону, чрезвычайно богат.
Он достигает от списков дополнительных данных ('a option
в F #), продолжений и многопоточности, вплоть до очень сложных вещей, таких как парсеры.
Просто начните реализовывать некоторые из них.
Основные занятия:
// 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) -> ...
Вы также можете улучшить свое понимание, играя немного с помощью вспомогательных функций и явного монадического синтаксиса.
// Given m >>= f for m.Bind(f)
let (>-) f monad = monad >>= (fun k -> return(f x))
// What's this?
let res = ((+) 1) >- [1..10]
Если вам нужны сложные примеры, взгляните на комбинаторы монадических парсеров . Это позволит вам реализовать сложные парсеры рекурсивного спуска на простом F # (взгляните на FParsec -Project)
let parseVector = parser {
do! ignore $ char '('
let! [x;y;z] = sepBy parseNumber ","
do! ignore $ char ')'
return new Vector(x, y, z)
}
Простая реализация для этого основана на следующих типах:
type 't Computation =
| Error of ...
| Result of 't
type Input = char list
type 'a Parser = Input -> (('a * Input) Computation)
Попробуйте реализовать bind и return ; -)
И в качестве общего совета: если вы действительно хотите понять монады в их естественной среде, вам придется использовать Haskell ;-) В F # есть только выражения для вычислений, просто расплывчатый аналог, но Haskell вводит общий интерфейс для любого монадического вычисления. Идеально, чтобы попробовать их!