功能

函数封装计算。

类型

写入参数类型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 )包含三个函数调用的元组。由于假定函数没有副作用,所以其他函数调用 (fh )被删除,因为它们的返回值从未使用过。

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

纯度

函数可以进一步注释为 pureimpure ,但目前还没有定义和检查这些语义:

pure fun addUp(xs:int^4) : int = {
  // ...
}

// or

impure fun addUp(xs:int^4) : int = {
  // ...
}