有关通用Scala函数的更多信息

ept*_*ptx 21 polymorphism haskell scala numeric

尝试在Scala中实现以下Haskell函数(来自Learn You a Haskell ...),以便它可以与Int,Double等一起使用.

doubleUs x y = x * 2 + y * 2 
Run Code Online (Sandbox Code Playgroud)

请注意,这与Scala类似:如何定义"通用"函数参数?

这是我的尝试和错误.有人可以解释正在发生的事情并提供解决方案.谢谢.

scala> def doubleUs[A](x:A,y:A)(implicit numeric: Numeric[A]): A = numeric.plus(numeric.times(x,2),numeric.times(y,2)) 
<console>:34: error: type mismatch;
 found   : Int(2)
 required: A
       def doubleUs[A](x:A,y:A)(implicit numeric: Numeric[A]): A = numeric.plus(numeric.times(x,2),numeric.times(y,2)) 
Run Code Online (Sandbox Code Playgroud)

mis*_*tor 20

除了@Dylan所说的,你可以通过将Numeric隐含内容导入范围来使它看起来不那么乏味,如下所示:

scala> def doubleUs[N](x: N, y: N)(implicit ev: Numeric[N]) = {
     |   import ev._
     |   x * fromInt(2) + y * fromInt(2)
     | }
doubleUs: [N](x: N, y: N)(implicit ev: Numeric[N])N

scala> doubleUs(3, 4)
res9: Int = 14

scala> doubleUs(8.9, 1.2)
res10: Double = 20.2
Run Code Online (Sandbox Code Playgroud)


Dyl*_*lan 19

你正在使用Int文字,2但scala期待这种Numeric类型A.在斯卡拉数字API具有实用功能- def fromInt(x:Int): T.这是您要使用,所以更换您的使用有什么2numeric.fromInt(2)

def doubleUs[A](x:A,y:A)(implicit numeric: Numeric[A]): A =
  numeric.plus (numeric.times (x, numeric.fromInt (2)), numeric.times (y, numeric.fromInt (2)))
Run Code Online (Sandbox Code Playgroud)

此外,由于Numeric实例定义了对Ops的隐式转换,您可以import numeric._然后说x * fromInt(2) + y * fromInt(2).


Did*_*ont 11

你需要在范围内有一些含义:

def doubleUs[A](x: A, y: A)(implicit num: Numeric[A]) = {
  import num._
  implicit def fromInt(i: Int) = num.fromInt(i)
  x * 2 + y * 2
}
Run Code Online (Sandbox Code Playgroud)