2009-05-28 15 views
5

Al migrar algún código a la última versión de F #, incluida en VS2010 b1, me he encontrado con un problema y me gustaría saber si hay una solución disponible y, si no, ¿Por qué se modificó el comportamiento del compilador F # para no admitir el escenario?F #: sobrecarga al curry/problema de sobrecarga tupled


type Foo(a) = 
    [<OverloadID("CurriedAbc")>] 
    member public x.Abc (p:(oneType * anotherType) seq) otherParm = method impl... 

    //this overload exists for better compatibility with other languages 
    [<OverloadID("TupledAbc")>] 
    member public x.Abc (p:Dictionary<oneType, anotherType>, otherParm) = 
     x.Abc(p |> Seq.map(fun kvp -> (kvp.Key, kvp.Value))) otherParm 

Este código produce el error en tiempo de compilación:

error FS0191: One or more of the overloads of this method has curried arguments. Consider redesigning these members to take arguments in tupled form

favor cuenta que este utiliza para trabajar sin problemas en F # 1.9.6.2 (CTP septiembre)

Respuesta

7

La razón de la cambio está en el detailed release notes:

Optimizations for Curried Methods

A curried member looks like this:

type C() =

static member Sum a b = a + b  

In previous implementations of F# curried members were compiled less efficiently than non-curried members. This has now been changed. However, there are now some small restrictions on the definition of curried members:

  • curried members may not be overloaded
  • some definitions of curried members may need to be adjusted to add the correct number of parameters to the definition

Debido a que su sobrecarga puede resolverse en Ly en el primer parámetro, debe ser capaz de trabajar alrededor de ella, cambiando la versión de curry a:

[<OverloadID("CurriedAbc")>] 
    member public x.Abc (p:(oneType * anotherType) seq) 
     = fun otherParm -> method impl... 
+0

Gracias por señalar la publicación título, que estaba escribiendo una pregunta para otro problema que tengo que solucionar y luego apareció y me olvidé del título :( PD: estoy probando tu solución ahora mismo para ver si funciona: D – em70