简单看看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,即函数是没有参数和返回值的。
浙公网安备 33010602011771号