Scala curried函数(带有一个参数)与方法有何不同?

Scala curried函数(带有一个参数)与方法有何不同?,scala,Scala,我很难理解curried函数(只有一个参数)与普通方法的区别。我试图用前者实现后者,但未能实现 我的市场特征定义如下: 包装市场{ 特色市场{ def getBuyRate(货币:字符串):双精度 def getSellRate(货币:字符串):双精度 } } 我还有另一个FakeMarket特性,它扩展了市场,我想用currying实现getBuyRate和getSellRate,如下所示: 包装市场{ 特色假货市场以可替代[加倍]扩大市场{ def getRate(系数:双精度)(货币:字

我很难理解curried函数(只有一个参数)与普通方法的区别。我试图用前者实现后者,但未能实现

我的
市场
特征定义如下:

包装市场{
特色市场{
def getBuyRate(货币:字符串):双精度
def getSellRate(货币:字符串):双精度
}
}
我还有另一个
FakeMarket
特性,它扩展了
市场
,我想用currying实现
getBuyRate
getSellRate
,如下所示:

包装市场{
特色假货市场以可替代[加倍]扩大市场{
def getRate(系数:双精度)(货币:字符串):双精度={
factor*this.iterator.next()
}
def getBuyRate=getRate(1)_
def getSellRate=getRate(1.02)_
} 
}
最后,我有一个扩展了FakeMarket的
随机FakeMarket
对象:

包装市场{
对象随机FakeMarket扩展了FakeMarket{
def迭代器=新迭代器[双精度]{
def hasNext=true
def next=100.0
}
}
}
将类型定义为这样会产生一个错误,说明:

<console>:10: error: object creation impossible, since:
it has 2 unimplemented members.
/** As seen from object RandomFakeMarket, the missing signatures are as follows.
 *  For convenience, these are usable as stub implementations.
 */
  def getBuyRate(currency: String): Double = ???
  def getSellRate(currency: String): Double = ???

       object RandomFakeMarket extends FakeMarket {
              ^

为什么这与我最初定义的
getBuyRate
不同?当只有一个论点时,为什么会有不同?现在看来,母公司trait
Market
不得不担心
getBuyRate
是如何实现的(一个普通函数还是一个curry函数)。

它与curry没有太大关系
def方法(p1:String,p2:String):String
不等同于scala中的
def方法:(String,String)=>String
。方法和函数之间的区别在于方法支持继承,因此它们需要知道方法的输入和输出,由于不明确,这一点并不明显:

def get:String=>Double
可以是
String->Double
(它被称为统一成员)和
()->String->Double
(被解释为函数)。但在scala中,它是
Function1[String,Double]
()Function1[String,Double]
,这两个函数在没有输入的意义上是相似的。不幸的是,
def get():String=>Double
在这里没有区别(参见下面的示例)

换句话说,该方法在scala中可能没有输入参数(因为它可能因为副作用而不是纯函数),所以它无法从
String=>Double
推断
(String)Double
,所以整个函数成为输出参数。例如,您可以在某些子类中执行
覆盖def method:(String,String)=>String
——这将覆盖不带参数且返回类型为
(String,String)=>String
,但不会覆盖输入为
(String,String)
且返回类型为
的方法

另一个问题是,方法的类型不同于函数,并且可能只能通过eta扩展进行单向转换,因此scala与:

scala>defAAA(b:String):String=“aaa”
(b:字符串)字符串
scala>aaa_
res4:String=>String=
scala>DefAAA:String=>String=(a:String)=>aa
aaa:String=>String
scala>def aaa()(b:String):String=“aaa”
aaa:()(b:字符串)字符串
scala>def aaa():String=>String=(a:String)=>aa
aaa:()字符串=>字符串

关于方法与函数的更多信息:

为什么会有所不同?在Scala中,方法和函数是不同的(例如,函数不能接受类型参数),因此,不能只在需要方法的地方使用函数。谢谢!那么,有没有一种方法可以像我之前尝试的那样,通过currying重用代码来实现getBuyRate和getSellRate呢?我想现在我可以做
getBuyRate(x:String)=getRate(1.0,x)
。当然,它将是
(String)Double
,因此这种多态性没有问题。
getBuyRate: String => Double
scala> def aaa(b: String): String = "aaa"
aaa: (b: String)String

scala> aaa _
res4: String => String = <function1>

scala> def aaa: String => String = (a: String) => "aa"
aaa: String => String

scala> def aaa()(b: String): String = "aaa"
aaa: ()(b: String)String

scala> def aaa(): String => String = (a: String) => "aa"
aaa: ()String => String