我对学习F#很感兴趣。
我使用函数式语言的唯一经验是在大学里上过两门关于Scheme的入门课程。
在学习F#的时候,有没有什么我应该记住的?有没有方法论上的不同,或者其他可能会给我带来麻烦的东西?
发布于 2010-12-08 13:41:09
Scheme是一种很好的函数式语言;在学校学习它应该为函数式编程提供良好的基础。
F#是静态类型的,而Scheme是动态的,这是一个明显的区别。如果你有其他静态语言的经验(特别是像C#这样的.NET语言),那么这不是什么大问题,但如果你的大部分经验是动态的,那将是一个改变。
学习主要的F#函数式编程函数(比如List.map)的名称很重要;大多数情况下,每种函数式语言都有相同的基本集合,但通常使用不同的名称(我不记得要比较的主方案名称)。
如果你手头上有旧的“编程任务”和示例输入/输出,那么用F#对它们重新编码可能会很有用,这是一种用语言“预热”的方式。
发布于 2010-12-08 21:02:54
在学习F#时,我有什么需要牢记的吗?有没有方法论上的不同,或者其他可能会给我带来麻烦的东西?
静态类型是Scheme和F#之间的主要区别。这促进了一种称为typeful编程的风格,其中类型系统用于编码有关函数和数据的约束,以便编译器在编译时证明程序的这些方面是正确的,并且任何违反约束的行为都会立即被捕获。
例如,相同类型的一个或多个元素的序列可能由以下类型的值传达:
type list1<'a> = List1 of 'a * 'a list
let xs = List1(1, [])
let ys = List1(2, [3; 4])编译器现在保证,任何试图使用这些序列中的空序列的尝试都会在编译时被捕获为错误。
现在,reduce函数在空序列上没有任何意义,所以的内置实现在运行时列出了barf,如果遇到空序列则会出现异常:
> List.reduce (+) [];;
System.ArgumentException: The input list was empty.
Parameter name: list
at Microsoft.FSharp.Collections.ListModule.Reduce[T](FSharpFunc`2 reduction, FSharpList`1 list)
at <StartupCode$FSI_0271>.$FSI_0271.main@()
Stopped due to error有了一个或多个元素的新序列,我们现在可以编写一个reduce函数,它不会在运行时抛出异常,因为它的输入由类型系统保证为非空:
let rec reduce f = function
| List1(x, []) -> x
| List1(x0, x1::xs) -> f x0 (reduce f (List1(x1, xs)))这是一种通过消除运行时错误的来源来提高软件可靠性的好方法,这是像Scheme这样的动态类型语言甚至无法开始做的事情。
发布于 2010-12-09 04:27:57
我建议也考虑Haskell,它们大致与F#和ML属于同一家族,并且Haskell包含了许多在其他地方找不到的有趣的函数概念。
看看tryhaskell.org上的交互式在线教程吧。
https://stackoverflow.com/questions/4384464
复制相似问题