小编Dav*_*ith的帖子

Predef.locally做了什么,它与Predef.identity有什么不同

通过Scala 2.8 Predef类,我发现有一种"本地"方法.尽管我可以说,它与Predef.identity相同,只是有"@inline"注释.它有什么用,为什么它在Predef中很重要(因此可以在Scala的任何地方使用)?

scala

37
推荐指数
1
解决办法
3847
查看次数

Scala中的Typedef

如何在Scala中定义类型?喜欢

type MySparseVector = [(Int, Double)]
Run Code Online (Sandbox Code Playgroud)

在哈斯克尔或

typedef MySparseVector = std::list<std::pair(int, double)>> 
Run Code Online (Sandbox Code Playgroud)

在C++中?

我试过了

type MySparseVector = List((Int, Double))
Run Code Online (Sandbox Code Playgroud)

但无法弄清楚如何使其发挥作用.如果我在类文件的开头写这个,我得到"预期的类或对象定义"错误.

PS对不起,我输错了.我试图在Scala中使用List [(Int,Double)].

scala

23
推荐指数
1
解决办法
2万
查看次数

为什么Scala需要递归函数的返回类型?

在下面的代码片段中,我有一个递归函数调用,用于在网络调用失败时促进重试(Amazon SimpleDB偶尔会返回503并需要重试.)

当我尝试编译时,Scala抱怨道recursive method simpledb_update needs result type.

// sends data to SimpleDB. Retries if necessary
def simpledb_update(name: String, metadata: Map[String,String], attempt: Int) = {
 try {
  db(config("simpledb_db")) += (name, metadata)
 } catch {
  case e =>
   // if it fails, try again up to 5 times
  if(attempt < 6)
  {
   Thread.sleep(500)
   simpledb_update(name, metadata, attempt + 1)
   } else
     AUlog(name + ": SimpleDB Failed")
   }
 }
Run Code Online (Sandbox Code Playgroud)

为什么递归函数需要这个?我的想法是只返回一个true/false布尔值来满足编译器...以下编译很好.

// sends data to SimpleDB. Retries if necessary
 def simpledb_update(name: String, …
Run Code Online (Sandbox Code Playgroud)

scala

22
推荐指数
2
解决办法
1万
查看次数

如何从Scala中的=> b => c得到(a,b)=> c?

如果我有:

val f : A => B => C
Run Code Online (Sandbox Code Playgroud)

这是以下的简写:

val f : Function1[A, Function1[B, C]]
Run Code Online (Sandbox Code Playgroud)

如何获得g带签名的功能:

val g : (A, B) => C = error("todo")
Run Code Online (Sandbox Code Playgroud)

(即)

val g : Function2[A, B, C] //or possibly
val g : Function1[(A, B), C]
Run Code Online (Sandbox Code Playgroud)

f

functional-programming scala currying

18
推荐指数
3
解决办法
4031
查看次数

Scala额外的无参数构造函数以及默认构造函数参数

我在构造函数上使用Scala 2.8默认参数,出于Java兼容性原因,我想要一个使用默认参数的无参数构造函数.

这不是出于非常明智的原因:

class MyClass(field1: String = "foo", field2: String = "bar") {
    def this() = {
        this() // <-- Does not compile, but how do I not duplicate the defaults?
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有任何我想念的东西.任何不需要重复参数默认值的想法?

谢谢!

constructor scala default-parameters scala-java-interop

9
推荐指数
1
解决办法
8162
查看次数

运算符作为函数文字

所以对于一个非常小的公式解释者,有人问我打码 - 高尔夫,我想做点什么

  val ops = Map("plus" -> + , "minus"-> -, "times"-> *, "div" -> / )
Run Code Online (Sandbox Code Playgroud)

允许关键字与其描述的功能之间的快速转换.这个语法不仅没有解析,也没有我试过(_ + _,_:Int.+_)解析的其他简写语法.有没有办法把它作为一种功能简写,或者我注定要完全写出lambdas,毁了我的高尔夫球得分.

编辑:问题只是整数.据我所知,超载会使这更加困难.

scala

8
推荐指数
1
解决办法
167
查看次数

有没有办法使用自定义BeanWrapper实现加载应用程序上下文

我希望能够将使用setter注入的Spring用于Scala组件.不幸的是,Scala的本地setter的命名与JavaBeans标准不同,foo_=而不是setFoo.Scala确实为此提供了几种解决方法,注释强制创建JavaBeans setter/getter以及本机Scala,但这需要注释我想要注入的每个组件.更方便的是BeanWrapper用一个知道如何处理Scala风格的getter和setter的方法覆盖Spring使用的方法.

似乎没有任何关于如何做这样的事情的文件,或者它是否可行,也没有其他任何人做过的在线例子.所以在深入研究之前,我想我会在这里查看

java spring scala javabeans

7
推荐指数
1
解决办法
935
查看次数

继承和(自动?)类型转换

请看一下下面的代码,其中Extractor[A,B]是通用框架的一部分,其他一切应该被视为"客户端代码"(我把它煮了很多,并重命名为所有内容.所以不要介意Extractor似乎没有太有用了).

scala> abstract class Extractor[A,B] {                                          
     |   def extract(d:A):B                                                     
     |   def stringRepr(d:A):String                                             
     | }                                                                        
defined class Extractor

scala> sealed abstract class Value                                              
defined class Value

scala> case class IntValue(i:Int) extends Value                                 
defined class IntValue

scala> case class StringValue(s:String) extends Value                           
defined class StringValue

scala> case class Data(i:Int, s:String)                                         
defined class Data

scala> sealed abstract class MyExtractor[Value] extends Extractor[Data, Value] {
     |   def stringRepr(d:Data) = extract(d) match {                            
     |     case IntValue(i) => i.toString                                       
     |     case StringValue(s) => …
Run Code Online (Sandbox Code Playgroud)

scala

7
推荐指数
1
解决办法
548
查看次数

为什么有从Float/Double到BigDecimal的隐式转换,而不是从String?

虽然与Java相比,从Doubles到BigDecimals 的转换情况有所改善

scala> new java.math.BigDecimal(0.2)
res0: java.math.BigDecimal = 0.20000000000000001110223024625156...

scala> BigDecimal(0.2)
res1: scala.math.BigDecimal = 0.2
Run Code Online (Sandbox Code Playgroud)

等等

val numbers: List[BigDecimal] = List(1.2, 3.2, 0.7, 0.8, 1.1)
Run Code Online (Sandbox Code Playgroud)

工作得很好,有一个隐含的转换是不合理的

implicit def String2BigDecimal(s: String) = BigDecimal(s)
Run Code Online (Sandbox Code Playgroud)

默认情况下可以将字符串转换为BigDecimals吗?

val numbers: List[BigDecimal] = List("1.2", "3.2", "0.7", "0.8", "1.1")
Run Code Online (Sandbox Code Playgroud)

还是我失去了一些东西和Scala解决Java的所有"问题"使用的BigDecimal构造与浮点值,而不是一个String,并且BigDecimal(String)基本上不斯卡拉不再需要?

floating-point scala implicit bigdecimal

6
推荐指数
1
解决办法
5199
查看次数

获取 Scala 特征中的命令行参数

我有大量简单的命令行 Scala 应用程序,它们共享相当多的通用结构。它们都继承自scala.App,这很好。我想将这些命令行应用程序的共享结构重构为一个共同的特征,然后我可以将其继承到我的(更简单的)命令行应用程序类中。问题的出现是因为一些公共结构包括命令行参数的解析。

object MyScript extends BaseScript with App{
   //small bits of business logic using components defined in BaseScript
}

trait BaseScript extends App{
    val configuration = loadConfiguration(args(0))
    //setup a bezillion components, usable from any of the scripts, based on the configuration
}
Run Code Online (Sandbox Code Playgroud)

它可以编译,但在实际取消引用时会失败并出现 NPE args,大概是因为该App特征尚未初始化。更改特征顺序并将 BaseScript 中 App 的继承更改为自类型声明不会执行任何操作,就像使用 DelayedInit 进行的实验一样。在 BaseScript 中将组件声明为“惰性”组件是可行的,但我也希望在初始化期间需要实际使用这些组件(例如,设置日志目录并根据配置加载 JDBC 驱动程序类),因此会失去惰性的好处。我可以做些什么来使命令行参数在 BaseScript 特征中可见并初始化吗?

scala

5
推荐指数
1
解决办法
5887
查看次数