简单看看F#实现了javascript的哪些功能

写这篇文章是因为前几天同时学习了一下javascript和F#,只是初步的学习但是给我的感觉是javascript是介于C#和F#之间的一种语言。

javascript里面遵循“万物皆是object” 的原则,写的方式十分灵活,在javascript里面函数,类,对象都是object。

C#是以变量作为第一等成员的语言,而F#是以函数作为第一等成员的语言,javascript看上去正好在两者之中。

因为javascript是解释型语言,所以它可以简单地传入一个函数作为参数,然后加个括号就能执行。

C#要做到这一点需要委托和表达是才勉强可以,F#作为函数式语言,也可以做到。

现在我们就简单看看F# VS JavaScript

1 用函数的形式定义类,

   JavaScript是这么做的:

   function fun1 ()

  { $("#result").append("<div>test</div>");

      this.Test = function () {...}

  }

   var object = new fun1();

   F#可以这么做

   type class1() =

      do "test" |> Console.WriteLine

      member x.Test() = ......

   let obj1 = new class1();

   我们能看到F#可以用一种十分类似函数的形式来做这个事情,但是F#的类型定义就是一个类型,它不能是一个函数。

   而且在这个类型定义内部执行语句需要用到关键字do,同时F#和javascript一样,定义公有成员的时候要加上一个代表自己的标示符,F#是"x",javascript是"this"

   上面的定义方法也可以带参数:

   type class2(a) = 
      member x.GetA = a;

   这时对传入参数只能绑定到一个member上,不能绑定到一个val上。

2  临时加入成员

    javascript一个最令人羡慕的功能就是任何一个对象都可以随时加入新成员

    var object1 = new class1();

    object1.newmethod = function(){......}

    很遗憾,F#做不到这一点,但利用with关键字,F#可以动态为一个类增加成员

    let obj1 = new class1();
    obj1.Test();

    type class1 with
      member x.Test2() = Console.WriteLine("member2 test");

    obj1.Test2();

    在动态增加Test2方法之前obj1是不可以调用Test2的,而一旦给这个类增加了成员,它的所有实例也便拥有了这个成员。这一点javascript要用prototype才能做到这一点。

    F#还可以在定义对象的时候动态override

    let object1 = { new System.Object() with member x.ToString() = "F#" }

3  让函数看起来像变量

     f#中也可以把一个函数作为参数传入,后然在后面加个()就执行它

    let Test3 (func : unit->unit) = func();

      其中unit表示void,即函数是没有参数和返回值的。

posted on 2012-02-03 17:30  袁璞  阅读(443)  评论(0)    收藏  举报

导航