2017-02-27 157 views
4

我有代码看起来像这样:如何编写Scala中的类型类?

/** 
    * A divisor that operates on real numbers. 
    */ 
case class RealDivisor(divisor: Long) 
    extends Divisor[Double, Double] 
    with Divisor[Long, Double] // ... with Divisor[Int, Double], etc. 
    { 

    override def divide(dividend: Double): Double = 
    if (divisor != 0) dividend/divisor.toDouble else 0 

    def divide(dividend: Long): Double = divide(dividend.toDouble) 

} 

我宁愿能够做这样的事情:

case class RealDivisor(divisor: Long) extends Divisor[A: Numeric] { 
    // ... 
} 

因此我只需要一次实现divide方法。我会如何做这样的事情?

+0

'数字'不会有太大的帮助,因为它没有实现分割。但是,如果您按照“Numeric”作为指南,您会发现许多这些实例不是免费的。你真的在找什么?是否可以通过其他数字类型来划分“Long”,还是将任何数字类型除以任何数字类型的能力? –

+1

[这个问题](http://stackoverflow.com/questions/40351176/generic-numeric-division)可能是有益的。 – jwvh

+0

@MichaelZajac我希望能够将类型转换为“Double”,以便我可以对其进行划分;这就是为什么我使用'Numeric'。 –

回答

0

你在找什么是field的想法。

A Field typeclass由例如, Spire

+0

我不想用另一个相同的数据类型寻找一个数据类型的划分。对不起,如果我的例子令人困惑。 –

+0

虽然你不知道,但我确定你是。真正的道路是Field和投影到你想要在分割之前/之后使用的数据类型。 – Apocalisp

+0

我看到'abstract def div(x:A,y:A):A'--绝对不是我想要的。 –