Scala:函数参数Int或Double,如何使其通用?

Scala:函数参数Int或Double,如何使其通用?,scala,generics,Scala,Generics,我几乎可以肯定已经有了答案,但作为Scala的初学者,我找不到答案 所以,我做了一个由两个参数组成的幂函数: def功率(x:Double,n:Int):Double={ @scala.annotation.tailrec def go(acc:Double,i:Int):Double={ 如果(i==0)acc else go(附件x,i-1) } go(1,n) } 如果我然后计算功率(2,3) println( 电源(2,3) ) 我得到了8.0,这是可以的,但是如果第一个参数是Int

我几乎可以肯定已经有了答案,但作为Scala的初学者,我找不到答案

所以,我做了一个由两个参数组成的幂函数:

def功率(x:Double,n:Int):Double={
@scala.annotation.tailrec
def go(acc:Double,i:Int):Double={
如果(i==0)acc
else go(附件x,i-1)
}
go(1,n)
}
如果我然后计算功率(2,3)

println(
电源(2,3)
)
我得到了
8.0
,这是可以的,但是如果第一个参数是
Int
,那么最好只使用
8
。我如何才能做到这一点?

您可以使用

类型类的魔力

您可以使用


类型类的魔力

您可以使用。这是一个常见的问题,您可以通过这些提示找到更多信息。@LuisMiguelMejíaSuárez感谢您提供的链接。如果你能写出解决方案,那就太好了。我不确定我是否完全理解文档。如果其中一个操作数是双精度的,那么操作的结果将是双精度的。所以,我认为这里的方法是在没有十进制数字的情况下格式化结果。@dexter2305当然,这将解决这里的问题,但我的示例有意简化,我希望有一个更一般的解决方案。您可以使用。这是一个常见的问题,您可以通过这些提示找到更多信息。@LuisMiguelMejíaSuárez感谢您提供的链接。如果你能写出解决方案,那就太好了。我不确定我是否完全理解文档。如果其中一个操作数是双精度的,那么操作的结果将是双精度的。所以,我认为这里的方法是在没有十进制数字的情况下格式化结果。@dexter2305当然,这将解决这里的问题,但我的示例有意简化,我希望有一个更通用的解决方案。奇怪的是,它仍然打印
8.0
。我刚刚将您的代码复制粘贴到我的IntelliJ Idea中。您可以使用
[T:Numeric]
&
导入Numeric.Implicits.\u
。我觉得那看起来更好。此外,最好隐式地使用
[Numeric[T]]。one
而不是
fromInt(1)
@EugeneBarsky请参见此处:它打印正确的结果。检查您的其他代码,它可能会在某个地方转换为Double。您也可以在Scala控制台中测试它。@texasbruce谢谢,现在它也适用于我,在我将它放在一个单独的文件中之后。可能是包中的其他语句影响了结果。奇怪的是,它仍然打印
8.0
。我刚刚将您的代码复制粘贴到我的IntelliJ Idea中。您可以使用
[T:Numeric]
&
导入Numeric.Implicits.\u
。我觉得那看起来更好。此外,最好隐式地使用
[Numeric[T]]。one
而不是
fromInt(1)
@EugeneBarsky请参见此处:它打印正确的结果。检查您的其他代码,它可能会在某个地方转换为Double。您也可以在Scala控制台中测试它。@texasbruce谢谢,现在它也适用于我,在我将它放在一个单独的文件中之后。可能包中的其他语句影响了结果。
def power[T](x: T, n: Int)(implicit num: Numeric[T]): T = {
  import num._
  @scala.annotation.tailrec
  def go(acc: T, i: Int): T = {
    if (i == 0) acc
    else go(acc * x, i - 1)
    }

  go(fromInt(1), n)
}

power(2, 3) // 8: Int