Классы типов, неявное преобразование, несколько параметров типа - PullRequest
1 голос
/ 29 мая 2019

Я пытаюсь создать класс типа с несколькими параметрами типа.Я пытаюсь вызвать метод неявным образом на основе типов

Я показываю простой фрагмент кода, который я пробовал.

object operation {
// Define generic trait class
  trait Operator[T, U] {
    def addition[T, U](l: U, r: T)(implicit p: Parameters): U
  }


  object Operator {
// Define type class.
    implicit object IntOperator extends Operator[Int, Float] {
      def addition(l: Int, r: Float): Float = {
        r
      }
    }
  }
// Create mapping for implicit call.
  def addition[T, U](l: T, r: U)(implicit op: Operator[T, U]): U = op.addition(l, r,)
  }

import  operation._

def fn(a: UInt, b: Float)
addition(a,b)

Если я использую параметр одного типа, т. Е. Только[T, U] тогда этот код компилируется нормально.Однако, если я использую два параметра типа, например, Operator [T, U], то добавление (a, b) не подаст жалоб. Не найдены последствия для параметра Operator [T, U].Буду признателен за любую помощь.

Я надеюсь, что в упрощенном фрагменте кода подробно описано, что я пытаюсь сделать.

1 Ответ

1 голос
/ 29 мая 2019

Просто чтобы вы знали, что это компилируется и работает, как и ожидалось.

object operation {
  trait Operator[T, U] {
    def addition(l: T, r: U): U
  }

  object Operator {
    implicit final val IntFloatOperator: Operator[Int, Float] =
      new Operator[Int, Float] {
        override def addition(l: Int, r: Float): Float = l + r
      }
  }

  def addition[T, U](l: T, r: U)(implicit op: Operator[T, U]): U = op.addition(l, r)
}

def fn(a: Int, b: Float): Float = operation.addition(a, b)
fn(1, 10.0f) // 11.0F

Редактировать

Обращаясь к комментарию, вы можете либо:

1) Предоставитьтребуемый неявный.

def fn[T1 <: Int, T2 <: Float](a: T1, b: T2)(implicit op: Operator[T1, U1]): U1 =
  op.addition(a, b)

(Примечание: пользователь метода отвечает за наличие в области действия неявного типа Оператор [T1, U1] для типовон / она использует.)

2) Явный вызов IntFloatOperator .

def fn [T1 <: Int, T2 <: Float] (a: T1, b: T2): T2 = неявно [Оператор [Int, Float]]. Сложение (a, b) </p>

(Примечание: для предоставления пользовательского призывателя принято сокращатьшаблон.)

object Operator {
  // Summoner.
  def apply[T, U](implicit op: Operator[T, U]): Operator[T, U] = op

  ...
}

def fn[T1 <: Int, T2 <: Float](a: T1, b: T2): T2 =
  Operator[Int, Float].addition(a, b)
...