Помогите с универсальной функцией в Scala - PullRequest
1 голос
/ 03 августа 2011

У меня есть следующий код, но он не компилируется.Я думаю, проблема в том, что мне нужно сказать ему, что T должен быть подклассом Event?

Тип scala.swing.Reactions.Reaction равен PartialFunction [Event, Unit]

Ошибка: несоответствие типов;найдено: PartialFunction [T, Unit] требуется: scala.swing.Reactions.Reaction

import scala.swing.event.MousePressed
import scala.swing.Component
import scala.swing.Reactions

import reactive.EventSource
import reactive.EventStream

class TypeIssue {
  type PartialAdapter[T] = (T => Unit) => PartialFunction[T, Unit]

  def adMousePressed(c: Component)(f: MousePressed => Unit): PartialFunction[MousePressed, Unit] = {
    case MousePressed(`c`, point, mods, clicks, triggersPopup) => f
  }

  def eventToStream[T](r: Reactions, ad: PartialAdapter[T]): EventStream[T] = {
    val v = new EventSource[T] {}
    r += ad(e => v.fire(e)) // error on this line
    v
  }
}

1 Ответ

2 голосов
/ 03 августа 2011

объявление возвращает функцию PartialFunction [MousePressed, Unit].Reactoins + = ожидает реакцию, которая является PartialFunction [Event, Unit].PartialFunction является контравариантным в своем первом аргументе типа, поэтому PartialFunction [MousePressed, Unit] не рассматривается как PartialFunction [Event, Unit]

Просто сделайте тип adreturn типом реакции.Вот код (без реактивных типов)

import scala.swing.event.MousePressed
import scala.swing.Component
import scala.swing.Reactions


class TypeIssue {
  type PartialAdapter[T] = (T => Unit) => Reactions.Reaction

  def ad(c: Component)(f: MousePressed => Unit): Reactions.Reaction = {
    case MousePressed(`c`, point, mods, clicks, triggersPopup) => f
  }

  def eventToStream[T](r: Reactions, ad: PartialAdapter[T]): Unit = {

    r += ad(e => ()) // error on this line
    ()
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...