Использование символа юникода в качестве инфиксного оператора в Scala - PullRequest
0 голосов
/ 14 ноября 2011

Кто-нибудь знает, почему следующий код не распознает ∙ как действительный инфиксный оператор?

object Main extends App {
  val c = (I() ∙ I())
}

sealed abstract class Term 
case class I() extends Term
case class ∙(x: Term, y: Term) extends Term

Ответы [ 3 ]

6 голосов
/ 14 ноября 2011

Определите как метод для I.

sealed abstract class Term 
case class II(x: Term, y: Term) extends Term
case class I() extends Term {
    def ∙(o: Term) = II(this, o)
}

Теперь I() ∙ I() будет работать, возвращая II.


Не уверен, что вы пытаетесь достичь, хотя.

4 голосов
/ 14 ноября 2011

Проще говоря, потому что это не так.Это object и class, но не метод, и только методы могут быть операторами (инфиксными или нет).

В качестве объекта вы можете использовать его при сопоставлении с образцом:

case a ∙ b =>

Как класс , если бы у него было два параметра типа , он использовал бы его в объявлениях типа:

type X = Int ∙ String
3 голосов
/ 14 ноября 2011

Это не связано с использованием символа Unicode.Я не знаю синтаксиса инфиксного конструктора.Поэтому, если вы хотите создать объект с инфиксным синтаксисом, вы можете сделать то, что предлагает Эмиль (добавив метод к Term или I), или использовать неявное преобразование:

sealed abstract class Term 
case class I() extends Term 
case class ∙(x: Term, y: Term) extends Term

class Ctor_∙(x: Term) {
  def ∙(y: Term): ∙ = new ∙(x, y)
}  

object Term {
  implicit def to_∙(x: Term): Ctor_∙ = new Ctor_∙(x)
}
  • Неявная версия больше похожа на Predef.any2ArrowAssoc для создания кортежей: 1 -> 2
  • Добавление метода больше похоже на List.::
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...