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.这是您要使用,所以更换您的使用有什么2用numeric.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)
| 归档时间: |
|
| 查看次数: |
1284 次 |
| 最近记录: |