Могу ли я применить аргументы по умолчанию при использовании частичных функций в Scala

Я определил две частичные функции (хэши), которые я ожидаю принять необязательный второй логический параметр:

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") 

Я просто реорганизовал это, чтобы использовать частичные функции, и, прежде чем рефакторинг, я мог заставить хэш-функцию использовать значение по умолчанию без каких-либо проблем.

Любые идеи, почему реализация частичной функции не позволяет аргументы по умолчанию? Я делаю что-то не так, используя как частичные функции, так и карри?

1 ответ

Решение

Когда вы используете частичное приложение для генерации функции, вы теряете возможность вызывать значение по умолчанию. Метод - это статическая вещь, поэтому компилятор знает, где искать значение по умолчанию; функцию можно передавать в разные контексты, поэтому компилятор, как правило, не будет иметь информации, необходимой для применения параметра по умолчанию.

Чтобы думать об этом иначе, функции знают только, сколько аргументов у них есть. Есть только один метод, apply, что вы передаете параметры в; в противном случае вам понадобится какой-то способ (предположительно, различных типов), чтобы различать, например, Function2-that-must-take-two-parameters и Function2-that-can-be-call-with-one-parameter-Кроме-также-потому что -есть-это-запасенной по умолчанию.

Другие вопросы по тегам