跳转到内容

环/教程/函数式编程

来自维基教科书,开放世界中的开放书籍
<

函数式编程

[编辑 | 编辑源代码]

在之前的章节中,我们学习了函数和递归。

在本章中,我们将学习更多函数式编程 (FP) 概念,例如

  • 纯函数
  • 一等函数
  • 高阶函数
  • 匿名函数和嵌套函数。
  • 函数的相等性



纯函数

[编辑 | 编辑源代码]

我们可以通过赋值运算符按值复制变量(列表和对象)来创建纯函数(不改变状态的函数),而不是通过引用操作传递给函数的原始数据。


示例

	Func Main
		aList = [1,2,3,4,5]
		aList2 = square(aList)
		see "aList" + nl
		see aList
		see "aList2" + nl
		see aList2

	Func Square aPara
		a1 = aPara		# copy the list
		for x in a1
			x *= x
		next
		return a1		# return new list

输出

	aList
	1
	2
	3
	4
	5
	aList2
	1
	4
	9
	16
	25

一等函数

[编辑 | 编辑源代码]

环编程语言中的函数是一等公民,您可以将函数作为参数传递,将它们作为返回值,或者将它们存储在变量中。

我们可以通过键入函数名称作为文字(例如“FunctionName”)或 :FunctionName 来传递/返回函数。

我们可以使用包含函数名称的变量来传递/返回函数。

我们可以使用 Call 命令从包含函数名称的变量中调用函数。

语法

	Call Variable([Parameters])

示例

	Func Main
		see "before test2()" + nl
		f = Test2(:Test)
		see "after test2()" + nl
		call f()

	Func Test
		see "Message from test!" + nl

	Func Test2 f1
		call f1()
		See "Message from test2!" + nl
		return f1

输出

	before test2()
	Message from test!
	Message from test2!
	after test2()
	Message from test!

高阶函数

[编辑 | 编辑源代码]

高阶函数是将其他函数作为参数的函数。

示例

	Func Main
		times(5,:test)

	Func Test
		see "Message from the test function!" + nl

	Func Times nCount,F

		for x = 1 to nCount
			Call F()
		next

输出

	Message from the test function!
	Message from the test function!
	Message from the test function!
	Message from the test function!
	Message from the test function!

匿名函数和嵌套函数

[编辑 | 编辑源代码]

匿名函数是无名的函数,可以作为参数传递给其他函数或存储在变量中。

语法

	Func [Parameters] { [statements] }

示例

	test( func x,y { 
				see "hello" + nl
				see "Sum : " + (x+y) + nl
		       } )

	new great { f1() }

	times(3, func { see "hello world" + nl } )

	func test x
		call x(3,3)
		see "wow!" + nl

	func times n,x
		for t=1 to n
			call x()
		next

	Class great
		func f1
			f2( func { see "Message from f1" + nl } )

		func f2 x
			call x()

输出

	hello
	Sum : 6
	wow!
	Message from f1
	hello world
	hello world
	hello world

示例

	Func Main
		aList = [1,2,3,4]
		Map (aList , func x { 
					return x*x 
				    } )
		see aList
		aList = [4,9,14,25]
		Map(aList, :myfilter )
		see aList
		aList = [11,12,13,14]
		Map (aList , func x {
			if x%2=0
				return "even"
			else
				return "odd"
			ok
		})
		see aList

	Func myfilter x
		if x = 9
			return "True"
		else
			return "False"
		ok

	Func Map aList,cFunc
		for x in aList
			x = call cFunc(x)
		next

输出

	1
	4
	9
	16
	False
	True
	False
	False
	odd
	even
	odd
	even

函数的相等性

[编辑 | 编辑源代码]

我们可以使用 '=' 或 '!=' 运算符测试函数是否相等。

示例

	f1 = func { see "hello" + nl }

	f2 = func { see "how are you?" + nl }

	f3 = f1

	call f1()
	call f2()
	call f3()

	see (f1 = f2) + nl
	see (f2 = f3) + nl
	see (f1 = f3) + nl

输出

	hello
	how are you?
	hello
	0
	0
	1


华夏公益教科书