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

    插个代码理解下,其中还有很多没说清楚的地方,还需要后续课程的支持,但是对自我调用和整个函数理解还是挺有帮助了

  

posted @ 2017-02-23 15:44  lixinnjupt  阅读(114)  评论(0编辑  收藏  举报