Я играл с монадами в F # (иначе говоря, вычислительные выражения) и написал эту простую монаду Identity:
type Identity<'a> =
| Identity of 'a
type IdentityBuilder() =
member x.Bind (Identity v) f = f(v)
member x.Return v = Identity v
let identity = new IdentityBuilder()
let getInt() = identity { return Int32.Parse(Console.ReadLine()) }
let calcs() = identity {
let! a = getInt() // <- I get an error here
let! b = getInt()
return a + b }
Я не понимаю, какую ошибку я получаю в отмеченной строке:
Ожидалось, что это выражение будет иметь тип Identity <'a>, но здесь имеет тип' b * 'c
Я думаю, что это не имеет смысла, поскольку getInt () явно является значением типа Identity<'a>
.
Может кто-нибудь сказать мне, что я делаю не так?