首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >学习F#时要牢记的内容,已经了解了方案

学习F#时要牢记的内容,已经了解了方案
EN

Stack Overflow用户
提问于 2010-12-08 13:28:18
回答 3查看 474关注 0票数 6

我对学习F#很感兴趣。

我使用函数式语言的唯一经验是在大学里上过两门关于Scheme的入门课程。

在学习F#的时候,有没有什么我应该记住的?有没有方法论上的不同,或者其他可能会给我带来麻烦的东西?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-08 13:41:09

Scheme是一种很好的函数式语言;在学校学习它应该为函数式编程提供良好的基础。

F#是静态类型的,而Scheme是动态的,这是一个明显的区别。如果你有其他静态语言的经验(特别是像C#这样的.NET语言),那么这不是什么大问题,但如果你的大部分经验是动态的,那将是一个改变。

学习主要的F#函数式编程函数(比如List.map)的名称很重要;大多数情况下,每种函数式语言都有相同的基本集合,但通常使用不同的名称(我不记得要比较的主方案名称)。

如果你手头上有旧的“编程任务”和示例输入/输出,那么用F#对它们重新编码可能会很有用,这是一种用语言“预热”的方式。

票数 3
EN

Stack Overflow用户

发布于 2010-12-08 21:02:54

在学习F#时,我有什么需要牢记的吗?有没有方法论上的不同,或者其他可能会给我带来麻烦的东西?

静态类型是Scheme和F#之间的主要区别。这促进了一种称为typeful编程的风格,其中类型系统用于编码有关函数和数据的约束,以便编译器在编译时证明程序的这些方面是正确的,并且任何违反约束的行为都会立即被捕获。

例如,相同类型的一个或多个元素的序列可能由以下类型的值传达:

代码语言:javascript
复制
type list1<'a> = List1 of 'a * 'a list

let xs = List1(1, [])
let ys = List1(2, [3; 4])

编译器现在保证,任何试图使用这些序列中的空序列的尝试都会在编译时被捕获为错误。

现在,reduce函数在空序列上没有任何意义,所以的内置实现在运行时列出了barf,如果遇到空序列则会出现异常:

代码语言:javascript
复制
> 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函数,它不会在运行时抛出异常,因为它的输入由类型系统保证为非空:

代码语言:javascript
复制
let rec reduce f = function
  | List1(x, []) -> x
  | List1(x0, x1::xs) -> f x0 (reduce f (List1(x1, xs)))

这是一种通过消除运行时错误的来源来提高软件可靠性的好方法,这是像Scheme这样的动态类型语言甚至无法开始做的事情。

票数 5
EN

Stack Overflow用户

发布于 2010-12-09 04:27:57

我建议也考虑Haskell,它们大致与F#和ML属于同一家族,并且Haskell包含了许多在其他地方找不到的有趣的函数概念。

看看tryhaskell.org上的交互式在线教程吧。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4384464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档