2009-12-16 13 views
5

He estado jugando con las mónadas en Fa # (también conocido como expresiones de cálculo) y yo escribimos este simple mónada Identidad:expresiones de cálculo personalizada en F #

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 } 

No entiendo el error que estoy recibiendo en el línea marcada:

se espera que esta expresión para tener identidad tipo < 'a> pero aquí tiene tipo' b * 'c

Creo que esto no tiene sentido como getInt() i s claramente un valor de tipo Identity<'a>.

¿Alguien puede decirme qué estoy haciendo mal?

Respuesta

9

La sintaxis de expresión de cálculo quiere que Bind tenga un argumento tupled, no curried. Así

member x.Bind((Identity v), f) = f(v) 

Ver this article para todas las firmas.

+1

O ver la sección 6.4.10 de la especificación de idioma: http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html – Brian

+1

Nota para mí: revisar esa wiki página porque no tiene sentido;) – Juliet

3

El problema es el tipo de su función Bind - no debería tomar argumentos curried. Si lo cambia a:

member x.Bind (Identity v, f) = f(v) 

entonces debería funcionar.

Cuestiones relacionadas