F #: curry sobrecarga / tupled sobrecarga questão
-
06-09-2019 - |
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)
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...