Определение типа функции и стирание типа в Scala - PullRequest
1 голос
/ 23 февраля 2011

Имеется следующий тип и экземпляр:

type operation = (Int, Int) => Int
def add: operation = _ + _

Если я пытаюсь сопоставить операцию в операторе case, Scala жалуется на непроверенную печать из-за стирания типа:

for (a <- elements) a match {
  case o: operation => // do stuff
}

Есть ли способ добиться такого типа функциональной типизации при одновременном стирании в операторах case?

Обратите внимание, это похоже на эту тему .

Ответы [ 2 ]

7 голосов
/ 23 февраля 2011

Один из простых способов справиться с стиранием типов - создать непараматизированный класс.Это не идеально, но это работает.Сделайте его классом, который расширяет Function2, и это даже не слишком неуклюже, чтобы использовать либо напрямую, либо в соответствии с шаблономне после.Кроме того, вы получаете один класс для каждого конкретного типа функции.

Другое, возможно, гораздо лучшее решение - не потерять информацию о типе.Используйте Either для сохранения информации о статическом типе.

scala> val elements : List[Either[Int, (Int, Int) => Int]] = List(Left(1), Right(_ + _), Left(2))
elements: List[Either[Int,(Int, Int) => Int]] = List(Left(1), Right(<function2>), Left(2))

scala> for (a <- elements) yield a match {
     | case Right(f) => f(1,2)            
     | case Left(x) => x                  
     | }

res1: List[Int] = List(1, 3, 2)

Ограничение здесь состоит в том, что он становится неуклюжим, если ваш список может иметь более 2 типов.Но это эффективно предотвращает использование языка Scala в качестве динамически типизированного языка, в отличие от предыдущего решения.

0 голосов
/ 25 февраля 2011

Если вы можете обернуть a в Option, то это будет работать:

scala> val a:Option[Any] = Some(add)
a: Option[Any] = Some(<function2>)

scala> a match { case o:Some[operation] => println ("found"); case _ => }
found
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...