学习F#时要记住什么,学习了Scheme

Zav*_*yan 6 scheme f#

我对学习F#很感兴趣.

我在函数式语言方面的唯一经验是在大学里开设了两门关于Scheme的入门课程.

在学习F#之前,我是否应该记住任何事情?方法,陷阱或其他可能给我带来麻烦的事情有何不同?

Jon*_*rop 5

在学习F#之前,我是否应该记住任何事情?方法,陷阱或其他可能给我带来麻烦的事情有何不同?

静态类型是Scheme和F#之间的主要区别.这有利于称为有类型编程的样式,其中类型系统用于编码关于函数和数据的约束,使得编译器在编译时证明程序的这些方面是正确的,并且立即捕获对约束的任何违反.

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

type list1<'a> = List1 of 'a * 'a list

let xs = List1(1, [])
let ys = List1(2, [3; 4])
Run Code Online (Sandbox Code Playgroud)

编译器现在保证在编译时将任何尝试使用这些序列中的空序列作为错误捕获.

现在,该reduce函数对空序列没有意义,因此在运行时列出barfs的内置实现如果遇到空序列则会出现异常:

> 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
Run Code Online (Sandbox Code Playgroud)

使用我们的一个或多个元素的新序列,我们现在可以编写一个reduce在运行时从不barfs而且有异常的函数,因为类型系统保证其输入非空:

let rec reduce f = function
  | List1(x, []) -> x
  | List1(x0, x1::xs) -> f x0 (reduce f (List1(x1, xs)))
Run Code Online (Sandbox Code Playgroud)

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


Bri*_*ian 3

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

F# 是静态类型的,而 Scheme 是动态类型的,因此这是一个明显的区别。如果您有使用其他静态语言(尤其是 C# 等 .NET 语言)的经验,那么这并不是什么大问题,但如果您的大部分经验是动态的,那将是一个变化。

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

如果您有旧的方案“编程作业”和示例输入/输出,那么用 F# 重新编码它们可能会很有用,作为使用该语言“热身”的一种方式。