cse341_pl_partA_note_02
Function(definition):
Syntax: fun x0 (x1: t1, x2: t2........,xn: tn) = e
-
-
- 当我们写出fun pow(.....)=e的时候,我们就新建了func bindiing 其实就是 fun x0=e 相当于val a=1,fun 和val , x0和a ,然后“=” 就是binding,然后就expression,这里面这个e就是常说的func body ,还有个很重要的机制就是我们定义时候不会evaluate 这个e(你也evaluate不了啊,没调用就没参数,没参数怎么evaluate啊),但是这个e一定是有value,所以说func always has a value,因为把x0添加到了动态环境中,所以在func body 中,我们就可以使用x0(因为他已经在动态环境中),这就是为什么能递归的自我调用的原因。
-
Type-check:
-
-
- 把x0加入静态环境中,它的type就是e 的type
- 因为e 可以调用前面的静态环境中量,即它是知道x1->type1,x2->t2....,那么通过expression 的rule,可以得到e的type,就得到x0的type
- 这里面有个注意点是,在check e 的type时候中的x1->t1....这些type只添加在e 即func body的静态环境中,其实这个这么理解,比如 fun c(a:int , b:int)= a+b,c和a+b的type是一样的,你在函数定义后面再定义下a=1.2, b=2.4,c还是int 吧,这个其他语言中函数作用域是一个意思,而且我一直觉得这个environment就是各种域也好,scope也好,就是各种生命周期的意思,只是为了支撑一种机制
-
Evaluation:
-
-
- 这里就引出了调用函数了,不call没有evaluation e
- 下面就很简单了,每个参数evaluate a value ,然后在定义的动态环境中扩张,最后都出e的value,然后就是x0 bind 这个value
-
fun pow (x: int , y: int )= if y=0 then 1 else x*pow(x,y-1) fun cube(x:int)= pow(x,3) val sixtyfour=cube(4) val fortytwo=pow(2,2+2)+pow(4,2)+cube(2)+2
插个代码理解下,其中还有很多没说清楚的地方,还需要后续课程的支持,但是对自我调用和整个函数理解还是挺有帮助了