我定义了两个部分函数(散列),我希望它们采用可选的第二个布尔参数:
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
}
Run Code Online (Sandbox Code Playgroud)
当我使用两个参数调用该函数时,它会编译,但只有一个参数时我会收到编译错误:
// 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")
Run Code Online (Sandbox Code Playgroud)
我只是将其重构为使用部分函数,在重构之前,我可以强制哈希函数使用默认值而不会出现任何问题。
为什么部分函数实现无法允许默认参数的任何想法?我使用部分函数和柯里化一起做错了吗?
我试图在 kotlin 中咖喱一个函数,这样我就可以这样称呼它
myAdditionFunction(1)(2)(3)
Run Code Online (Sandbox Code Playgroud)
这个调用将返回 6 因为1+ 2 + 3 = 6
我只需要它对所有数字进行加法。实际上我真的希望它在未来做一个构建器模式,但仍然试图看看 curry 函数是如何工作的。这是我到目前为止所拥有的:
fun myAdditionFunction(x: Int) { { y: Int -> x + y }
Run Code Online (Sandbox Code Playgroud)
这适用于两个参数。所以 myAdditionFunction(1)(2) 将打印 3。
我希望它适用于 3 个或多个:这是我为 3 个参数尝试过的:
fun myAdditionFunction(x: Int) {
var sum = 0
return { y: Int ->
sum = x + y
sum }
}
Run Code Online (Sandbox Code Playgroud)
我如何将总和向前推进以及如何使其采用第三个内部功能?它不会编译。
但它不会编译
Hutton 的 Haskell 编程
一般来说,if 是一个运算符,则参数 和 的
#
形式的表达式 称为节,其作为函数的含义可以使用 lambda 表达式形式化,如下所示:(#)
(x #)
(# y)
x
y
Run Code Online (Sandbox Code Playgroud)(#) = \x -> (\y -> x # y) (x #) = \y -> x # y (# y) = \x -> x # y
“部分”和“柯里化”有什么区别和关系?
一个部分是将柯里化操作应用于多参数函数的结果吗?
谢谢。
haskell operators currying partial-application operator-sections
答案是:(a -> b) -> (c -> d -> a) -> c -> d -> b
但我不知道怎么去那里。
haskell types type-inference currying parametric-polymorphism