2010-09-08 10 views
12

haskell programador. usando F #. no hay clases de tipos en F #. ¿Qué usar cuando necesito clases de tipo?alternativa a las clases de tipos?

+2

No estoy seguro si esto es un duplicado, pero al menos las respuestas a esta pregunta son altamente relevantes: http://stackoverflow.com/ questions/501069/f-functions-with-generic-parameter-types – Chuck

+3

¿Puede dar un ejemplo concreto de cuándo "necesita tipos de clases"? –

+14

@Jon Harrop: ¿Puedes dar un ejemplo concreto de cuándo "necesitas" alguna función de idioma? Al final, una vez que tienes la equivalencia de Turing, todo lo demás es solo sintaxis y conveniencia. Las clases de tipo son el enfoque más expresivo del polimorfismo ad-hoc con el que estoy familiarizado. ¿Crees que el polimorfismo de subtipos y la sobrecarga de miembros son útiles? –

Respuesta

20

Haga check out this como alguien sugirió.

Creo que la respuesta corta es pasar diccionarios de operaciones (como lo haría Haskell bajo el capó, el testigo de la instancia).

O cambie el diseño para que no necesite tipos de clases. (Esto siempre es doloroso, ya que las clases de tipo son lo mejor y es difícil dejarlas atrás, pero antes de que surgieran Haskell y las clases tipográficas, la gente todavía podía programar durante 4 décadas anteriormente sin clases de letra, así que haz lo mismo que hicieron esas personas .)

También puede obtener algunas maneras con inline restricciones de miembros estáticos, pero eso se pone feo rápidamente.

Aquí está un ejemplo de diccionario de operaciones:

// type class 
type MathOps<'t> = { add : 't -> 't -> 't; mul: 't -> 't -> 't } //' 

// instance 
let mathInt : MathOps<int> = { add = (+); mul = (*) } 

// instance 
let mathFloat : MathOps<float> = { add = (+); mul = (*) } 

// use of typeclass (normally ops would the 'constraint' to the left of 
// the '=>' in Haskell, but now it is an actual parameter) 
let XtimesYplusZ (ops:MathOps<'t>) x y z = //' 
    ops.add (ops.mul x y) z 

printfn "%d" (XtimesYplusZ mathInt 3 4 1) 
printfn "%f" (XtimesYplusZ mathFloat 3.0 4.0 1.0) 
+0

@Brian: "las clases de tipos son lo mejor que hay". Me encantaría ver un ejemplo en el que las clases de tipos resuelvan un problema real que no se resolvió mejor con otra técnica. Además, su ejemplo actualiza el diccionario de operaciones en lugar de definirlas con la definición de tipo original. ¿Es eso posible con las clases de tipo? –

+14

@Jon Harrop: ¿Qué? Por supuesto que es. La definición de clases de tipos e instancias está completamente separada de la definición de tipos. Ni siquiera tienen que estar en el mismo módulo. Si la memoria me sirve, la versión de Scala es aún más poderosa y te permite tener definiciones con alcance local (pero no conozco a Scala, así que puedo estar confundido). –

+0

@camccann: Ah sí, por supuesto. Es por eso que no puede confiar en que se resuelvan estáticamente por lo que su desempeño podría ser el de boxeo y despacho en lugar de una instrucción MLA, un rendimiento que degrada impredeciblemente en un orden de magnitud como lo hace en el ejemplo de Brian. –

Cuestiones relacionadas