Pergunta

Se eu tiver uma função:

f : A => B => C

Eu posso definir uma conversão implícita de modo que isso possa ser usado onde uma função (A, B) => C é esperado. Isso também vai na outra direção.

Por que essas conversões não são implícito (ou disponível implicitamente)? Estou assumindo que Coisas ruins poderiam acontecer Para algum valor de coisas ruins. Que valor é isso?

Foi útil?

Solução

Eu não acho que nada de ruim vai acontecer. A conversão é completamente inequívoca. Na pior das hipóteses, o Scala não será capaz de descobrir que a conversão implícita se aplica.

implicit def curryImplicitly[A,B,C](f: (A, B) => C) =
  (a: A) => (b: B) => f(a, b)
implicit def uncurryImplicitly[A,B,C](f: A => B => C) =
  (a: A, b: B) => f(a)(b)

Por outro lado, isso também seria útil.

implicit def flipImplicitly[A,B,C](f: (A, B) => C) =
  (b: B, a: A) => f(a, b)
implicit def flipImplicitlyCurried[A,B,C](f: A => B => C) =
  (b: B) => (a: A) => f(a)(b)

Mas esses não são transitivos, então você precisa disso:

implicit def flipAndCurry[A,B,C](f: (A, B) => C) =
  (b: B) => (a: A) => f(a, b)
implicit def flipAndUncurry[A,B,C](f: A => B => C) =
  (b: B, a: A) => f(a)(b)

Mas agora a conversão é ambígua. Portanto, não são todas as rosas.

Vamos saber como funciona na prática. Você pode precisar de equivalentes para função3, função4, etc.

Outras dicas

Você não deseja que eles sejam implicitamente disponíveis por padrão (sempre on), porque o sistema de tipos tem problemas para ajudá-lo quando você está sobrecarregado com argumentos de um monte de tipos semelhantes:

A => B => C
D => C      // D is allowed to be a tuple (A,B)...

(A,B) => C  // If I have this, to whom should I convert?

Parte da vantagem da duração forte está avisando quando você fez algo tolo. Tentar muito para fazer as coisas funcionarem reduz os benefícios. Aqui, se as conversões foram realizadas automaticamente, você pode não chamar o método que pretendia ligar.

Tê -los disponíveis implicitamente mediante solicitação é bom, mas não é tão difícil fazê -lo, se precisar. Isso é algo que eu usaria raramente; Eu não colocaria isso nos meus dez primeiros ou provavelmente até as centenas de coisas que eu gostaria na biblioteca (em parte porque posso preferir a conversão automática em uma tupla em vez do curry/sem grade automático).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top