我从一本SML书中了解到,SML中的函数总是只有一个参数:元组。一个接受多个参数的函数就是一个接受一个元组作为参数的函数,在函数绑定中使用元组绑定来实现。我明白这一点。
但在这之后,这本书说了一些我不明白的话:
this point makes SML language flexible and elegant design, and you can do something useful that you cannot do in Java.
为什么这种设计使语言变得灵活?SML可以但java不能的文本指的是什么?
当我学习thunk时,我觉得它们就像是函数。为什么叫thunk? 推送 function add(x, y){
return x + y
}
function thunk() {
return add(10, 20)
} 函数currying function multiply(a, b, c) {
return a * b * c;
}
function multiply(a) {
return (b) => {
return (c) => {
return a * b * c
}
}
虽然我知道什么是部分应用/curried函数,但我仍然不能完全理解为什么我要使用这样一个函数而不是简单地重载一个函数。例如,给定:
def add(a: Int, b: Int): Int = a + b
val addV = (a: Int, b: Int) => a + b
两者的实际区别是什么?
def addOne(b: Int): Int = add(1, b)
和
def addOnePA = add(1, _:Int)
// or currying
val addOneC = addV.curried(1)
请注意,我不是在问关于currying vs部分应用函数的问题,因
刚开始使用JavaScript和jQuery时,我遇到了这个问题:
foo(validation);
function foo(func) {
var time = new Date().getTime();
// do some other stuff
func("foobar" + time);
}
function validation(elementName) {
// do stuff
}
但是,当我使用验证函数指针调用函数foo时,我也想在此时传入字符串"foobar“。
我正在尝试理解Java中的currying,并创建了以下简单的示例。这是一个有效的例证吗?还是我没有抓住要点? // Before
House constructHouse1(Foundation f, Building b) {
return new House(f, b);
}
// After
House constructHouse2(Foundation f, Building b) {
return constructHouseWithBuilding(b).apply(f);
}
Fun
我注意到在SML中有两种定义函数的方法。例如,如果使用add函数,以下两种方法:
fun add x y = x+y;
fun add(x,y) = x+y;
第一个方法将函数类型创建为:
val add = fn : int -> int -> int
第二个函数类型创建如下:
val add = fn : int * int -> int
对于相同的函数,这两种类型有什么区别?为什么同一函数有两种类型呢?
嗨,我对这个Javascript函数感到困惑:
var currying = function(a) {
return function(b){
return function(c){
return function(d){
return a + b /c * d;
};
};
};
};
var a = currying(4)(8);
var b = a(2)(6);
console.log(b);
它输出28,但我不知道Javasc
ML族语言具有自动运行功能--其中包含两个参数的函数调用被认为一次应用于一个参数,即f x y = (f x) y --而其他语言家族则不这样做。
这是一次历史性的事故,还是有技术原因?
请注意,我并不是在问自动竞逐是好还是坏(这是主观判断)。我想问的是,它是否与ML家族语言的其他特性协同作用,以便更自然地包含在这些语言中,如果是的话,这些特性是什么,协同作用的本质是什么?或者反过来说,其他语言家族的特性是否会与任何提供自动竞逐的尝试发生冲突?
编辑:除了给出的答案之外,我还想到了另一个因素:如果你用一种模式匹配的语言编写编译器,AST可以变得更复杂,这意味着传统的“用元组调用”构造是一个复合
问题如下:
create a sum function, and the requirement:
sum(1,2).result === 3
sum(1,2)(3).result == 6
sum(1,2)(3,4).result == 10
sum(1,2)(3,4)(5).result == 15
这是一个关于currying in JS的问题。我已经实现了问题的大部分功能。对我来说,棘手的一点是.result。
在sum(1,2)之后.result是什么意思?它是一个属性吗?
如何在我的代码中添加.result?
function sum(){
var count = 0