Scala中的泛型算子

Scala中的泛型算子,scala,generics,operators,Scala,Generics,Operators,可以在Scala中定义泛型运算符吗 Scala允许我在函数上映射任意运算符,这非常有用。然而,在我可能希望操作符根据应用程序的状态进行更改的情况下,这似乎是有限制的 举个例子:我有一个包含用户的表和一个包含各自关系的表。每种关系都有一种类型,例如:“与之交朋友”、“与之合作”等。 基于我的域模型,我希望DSL允许:is(john friends with mary)。在这种情况下,john和mary都是对象User,这将有一个通用操作符def(a:User):Boolean={…} 我想要实

可以在Scala中定义泛型运算符吗

Scala允许我在函数上映射任意运算符,这非常有用。然而,在我可能希望操作符根据应用程序的状态进行更改的情况下,这似乎是有限制的


举个例子:我有一个包含用户的表和一个包含各自关系的表。每种关系都有一种类型,例如:“与之交朋友”、“与之合作”等。 基于我的域模型,我希望DSL允许:
is(john friends with mary)
。在这种情况下,
john
mary
都是对象
User
,这将有一个通用操作符
def(a:User):Boolean={…}


我想要实现的正是Dynamic允许我做的事情(见答案)。描述非常符合:

支持动态调用的标记特性。此特性的实例x允许对任意方法名meth和参数列表args调用x.meth(args)。如果x本机不支持某个调用,则会将其重写为x.applyDynamic(“meth”,args)


这里有更多信息:

看看特性动态,它将在Scala 2.10上提供(它在Scala 2.9上是实验性的)

例如:

scala> :paste
// Entering paste mode (ctrl-D to finish)

case class User(name: String) extends Dynamic {
  def applyDynamic(relationship: String)(to: User) =
    Relation(relationship, this, to)
}
case class Relation(kind: String, from: User, to: User)

// Exiting paste mode, now interpreting.

defined class User
defined class Relation

scala> User("john") friendsWith User("mary")
res0: Relation = Relation(friendsWith,User(john),User(mary))

看看特性动态,它将在Scala2.10上提供(它在Scala2.9上是实验性的)

例如:

scala> :paste
// Entering paste mode (ctrl-D to finish)

case class User(name: String) extends Dynamic {
  def applyDynamic(relationship: String)(to: User) =
    Relation(relationship, this, to)
}
case class Relation(kind: String, from: User, to: User)

// Exiting paste mode, now interpreting.

defined class User
defined class Relation

scala> User("john") friendsWith User("mary")
res0: Relation = Relation(friendsWith,User(john),User(mary))

你能澄清一下你的意思吗?在实现/重写此方法时更改其符号的可能性?您知道TypeClass吗?在谷歌上搜索“scala类型类”可以让你更深入地了解它。假设您希望为其他类型(而不仅仅是用户)提供
方法。那么您希望表达式
john friends with mary
返回什么?对不起,我意识到我的示例比帮助更令人困惑。实际上,我想做的正是Dynamic和TypeClass允许做的事情!你能澄清一下你的意思吗?在实现/重写此方法时更改其符号的可能性?您知道TypeClass吗?在谷歌上搜索“scala类型类”可以让你更深入地了解它。假设您希望为其他类型(而不仅仅是用户)提供
方法。那么您希望表达式
john friends with mary
返回什么?对不起,我意识到我的示例比帮助更令人困惑。实际上,我想做的正是Dynamic和TypeClass允许做的事情!代码不错。但我仍然不确定问题的作者所说的“泛型”是什么意思。他不希望关系类型硬编码在一组固定的方法中,而是希望使用被调用的方法的名称作为底层结构(在本例中为applyDynamic)的参数来编写好的代码。但我仍然不确定问题的作者所说的“泛型”是什么意思。他不希望关系类型硬编码在一组固定的方法中,而是希望使用被调用的方法的名称作为底层结构的参数(在本例中为applyDynamic)