Scala 从一个字符串创建一个数字

标签 scala

我想做这样的事情:

def parse[A: Numeric](str: String): A = {
   if A =:= Int, str.toInt
   if A =:= Float, str.toFloat
   if A =:= BigInt, BigInt(str)
   ...
   ...
}

不幸的是,Numeric 特征中似乎没有定义fromString。在 Scala 中实现此目的最惯用的方法是什么?

最佳答案

由于类型类的可扩展性,您所要求的通常是不可能的;您无法匹配 Numeric 的所有可能实现,因为任何用户定义的类型都可以实现它。同样,因此,不能保证每个 Numeric[A] 都可以从字符串中解析。

有两种解决方法。一种是部分解决方案,您确保只使用表示整数文字的字符串,然后使用 IntfromString 来解析它和 Numeric' s fromInt 进行转换。

另一种方式是在调用函数时传入实际的字符串解析函数。这有点像作弊,因为您的 parse 方法不再做任何实际工作,但可以通过隐式变得非常有用。

最直接的方法是添加一个(可能是隐式的)String -> A 参数(或者可能是 String -> Option[A] 以减少运行时错误) .实现此目的的另一种方法是转到 the typeclass route again and implement something like a Readable typeclass .然后你可以让你的功能如下:

def parse[A: Numeric: Readable](x: String): A = ...

现在您只需要确保您对所有您关心的A 都有Readable[A] 实现。

关于Scala 从一个字符串创建一个数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35980321/

相关文章:

scala:选项元组上的复杂 flatMap

java - 不能将 A[T] 隐式转换为 AT,其中 A[T] 扩展 AT

scala - 如何在 stub 上调用真实方法

scala - Slick:autoInc 在 MultiDBCakeExample 示例中是如何工作的?

scala - 无标签final中的parSequence和parTraverse

Scala 防止混合的方法

scala - Heroku 的 Play/scala 应用停止运行

Scala 排序集 : I cannot get how ordering works

scala - 如何配置 Play 应用程序以使用 Let's Encrypt 证书并转换 Let's Encrypt 证书以便 play 可以理解它?

git - sbt 如何从 git 中提取依赖项?