功能
函数封装计算。
类型
写入参数类型D返回值类型C的函数类型
D -> C
按表达式定义
函数可以由表达式定义:
fun square (x:int) : int => x * x;
或者没有返回类型:
fun square (x:int) => x * x;
在这种情况下,它被推断出来。
按语句定义
更复杂的函数可以用语句定义。
fun addUp(xs:int^4) : int = {
var sum = 0;
for x in xs do
sum = sum + x;
done
return sum;
}
返回类型可以省略:
fun addUp(xs:int^4) = {
var sum = 0;
for x in xs do
sum = sum + x;
done
return sum;
}
无副作用
函数的效果必须完全捕捉到它的返回值中;也就是说,它可能没有任何副作用。此操作当前未被选中,因此您可以编写如下代码:
var mutMe = 0;
fun addUp(xs:int^4) : int = {
mutMe = 1; // bad!
var sum = 0;
for x in xs do
sum = sum + x;
done
return sum;
}
但是,这种用法有时可能会有用,例如用于调试。
函数中缺少副作用是在优化中使用的,优化可能会对程序行为产生影响。例如,下面的玩具程序使用第二个投影 (. 1
)包含三个函数调用的元组。由于假定函数没有副作用,所以其他函数调用 (f
和 h
)被删除,因为它们的返回值从未使用过。
fun f(x:int) = {
println "hi from f!";
return 2*x;
}
fun g(x:int) = {
println "hi from g!";
return 3*x;
}
fun h(x:int) = {
println "hi from h!";
return 4*x;
}
val res = (f 5, g 5, h 5) . 1;
println res;
程序的输出只是:
hi from g!
15
纯度
函数可以进一步注释为 pure
或 impure
,但目前还没有定义和检查这些语义:
pure fun addUp(xs:int^4) : int = {
// ...
}
// or
impure fun addUp(xs:int^4) : int = {
// ...
}