Pergunta

Durante a migração algum código para a última versão do F #, incluído no VS2010 b1, eu encontrei um problema e eu gostaria de saber se há uma solução disponível e - se não - por que o comportamento do compilador F # modificada para não suportar o cenário.


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 produz o seguinte erro de tempo de compilação:

erro FS0191: Um ou mais argumentos das sobrecargas desse método tem curry. Considere redesenhar estes membros a tomar argumentos em forma tupled

Por favor mente que este usado para funcionar perfeitamente em F # 1.9.6.2 (Sept. CTP)

Foi útil?

Solução

A razão para a mudança é na notas de lançamento detalhadas :

otimizações para métodos Curried

A curry olhares membros como esta:

de tipo C () =

static member Sum a b = a + b    

Em implementações anteriores do F # membros curry foram compilados menos eficientemente do que os membros não-curry. Isto já foi alterado. Contudo, agora existem algumas pequenas restrições na definição de membros curry:

  • membros curry não pode ser sobrecarregado
  • algumas definições de membros curry pode precisar de ser ajustado para adicionar o número correto de parâmetros para a definição

Desde a sua sobrecarga pode ser resolvido apenas no primeiro parâmetro, você deve ser capaz de trabalhar em volta dele, alterando a versão curry para:

    [<OverloadID("CurriedAbc")>]
    member public x.Abc (p:(oneType * anotherType) seq)
       = fun otherParm -> method impl...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top