0

我已经定义了两个部分函数(哈希),我希望它们带有一个可选的第二个布尔参数:

def SHA1 = hash(MessageDigest.getInstance("SHA-1"))_
def MD5 = hash(MessageDigest.getInstance("MD5"))_
private def hash(algorithm:HashAlgorithm)(s:String, urlencode:Boolean = false) = {
    val form = if (urlencode) "%%%02X" else "%02X"
    (algorithm.digest(s.getBytes) map(form format _)).mkString
}

当我使用两个参数调用函数时,它会编译,但只有一个参数会出现编译错误:

// First 3 tests are fine
val test1 = hash(MessageDigest.getInstance("SHA-1"))("foo", true)
val test2 = hash(MessageDigest.getInstance("SHA-1"))("foo")
val test3 = SHA1("foo", true)
// not enough arguments for method apply: (v1: String, v2: Boolean)String in trait Function2. Unspecified value parameter v2.
val test4 = SHA1("foo") 

我只是将其重构为使用部分函数,​​在重构之前我可以强制哈希函数使用默认值而没有任何问题。

为什么部分函数实现无法允许默认参数的任何想法?我使用部分函数和柯里化在一起做错了吗?

4

1 回答 1

5

当您使用偏应用程序生成函数时,您将失去调用默认值的能力。方法是静态的,所以编译器知道去哪里查找默认值;一个函数可以传递到不同的上下文中,因此编译器通常不会拥有应用默认参数所需的信息。

换一种方式考虑,函数只知道它们有多少参数。只有一种方法,apply您可以将参数传递给;否则您需要某种方式(可能是不同的类型)来区分,例如,Function2-that-must-take-two-parameters 和 Function2-that-c​​an-be-call-with-one-parameter-also-because -there-is-a-stored-default。

于 2014-04-21T21:22:07.510 回答