函数基本的(概念)

函数时可重用逻辑的基本单元。

一个函数可以看作是一个逻辑片段,有些参数,执行若干操作,返回这些操作的结果。

Luna中函数也是普通值,可以自由传递。

大多数目前所用到的节点本质是函数。

本节将学习到如何定义并运用函数。

调用函数

文本表示法中通过传递空格隔离的参数来调用函数。

可视化表示法中对应设置节点相应端口的值,通过连接或在表达式中、如滚动条这种端口控件上设置。

a = 1
b = 2
c = add a b
d = add 53 2

一等函数

函数在Luna中是一等公民。

意味着可以向别的(普通)值来对待函数。

可以分配给变量,以参数传递给别的函数,甚至保存到数据结构(如列表或字典等)。

Luna的很多类和库定义函数或方法期望函数作为参数。

最常见的例子,List的each/fold方法。

前者是需要一个参数的函数,在列表的每个元素上调用它;后者是需要两个函数的参数,把所有元素联合在一起。

f = x: x + 2
myList = [1, 2, 3]
myList.each f # => [3, 4, 5] 就是 [1+2, 2+2, 3+2]
myList.fold 0 add # => 6 就是 1 + 2 + 3

函数的类型

由于函数是任何值(参数值/返回值),需要类型(所有值在Luna中都是有类型的)。

需要一个参数A且返回B的函数类型就是“A->B”。

很容易记住,认为箭头表示A类型转换成B类型。

多参数函数要用更多箭头,例如需要一个Real参数、一个Int参数,返回Text的函数类型是“Real->Int->Text”。

箭头链的最后一部分是返回值,之前的其余部分是连续的参数。

柯里化(Currying)

Luna至此柯里化。

这意味着可给函数提供少于期望个数的参数。

固定函数的一部分参数,允许延迟传递剩下的参数。

这在以参数传递函数中非常有用。

可将之前的例程重写如下:

myList = [1, 2, 3]
myList.each (+ 2)

理解使用节点时“柯里化”是如何工作的也很重要。

无论何时,都不要设置端口的值,该参数自动柯里化。

通过改变节点输出的类型来展示。

注意:输出类型如何改变取决于所连接端口的数量,展示一个函数的不同柯里化变体

  • 节点“add1”没有设置任何参数,输出类型是“Int->Int->Int”。
  • 节点“add2”第二个参数有连接,输出类型是“Int->Int”。注意表达式中的“”,该下划线提出该参数明确的柯里化,“add number1”的意思是“设置第二个参数并搁置第一个参数不用”。
  • 节点“add3”应用第一个参数搁置第二个参数,这里不需要下划线,因为应用的参数先于未应用的参数。类型和“add2”一样,因为参数类型相同。
  • 节点“add4”应用全部参数,返回类型就是Int。

results matching ""

    No results matching ""