你的第一个F#程序

#如果看到这篇文章的你是SYSU-MSTC的面试者,恭喜你通过了一面还选择了F#这个主题作为你二面的题目,这是一个超级有趣的选择。

首先先介绍一下F#的一些特点

  • 函数式语言——一面的时候很多人都提到过自己了解过C、C++这样的语言,又或者是python这样的语言,但是F#和他们有着非常大的区别(或许Python有一些函数式的特征)。像是C这样的语言我们称作过程式的语言,可以理解为输入的命令是一个个按照一定的顺序组织起来的命令,计算机按照特定的顺序执行这些命令。但是像F#这样的函数式语言,有着更接近于我们数学理解中的函数的特性,在函数语言中数据和操作数据的动作没有本质上的区别,他们都可以理解成一组由某个值映射到某个值的函数。或许这样的解释还是有点抽象,但是函数式语言确实是非常适合计算机初学者的入门语言。MIT麻省理工学院的大学一年级编程课程就是使用一种名为Lisp的函数式语言的变种进行教学的。掌握函数式的概念也对掌握C系语言非常有帮助。
  • 现代语言——F#是微软设计的一款现代函数式语言,如果你看过我们之前的面试题就会知道我们之前也出过Haskell这样的函数式语言作为考试题目。Haskell是一门非常有趣的入门语言(当然因为考过我们就不会再考啦),但是我们又不想考察Lisp和其变种,因为只要稍微查看一下Lisp的语法就会知道Lisp及其变种有一个对入门编程者非常不友好的特性——它的所有表达式都是以前缀的形式书写的。例如3 + 2 – 9就要写成 – (+ 3 2) 9。所以我们选择了F#这样一款比较现代又比较有趣的函数式语言作为考查

1.准备工作

Visual Studio 2015 Community 下载

非常遗憾的是由于F#是微软设计并开发的语言,所以目前只有Visual Studio 2010以上的编译器能够编译F#的代码,如果你的电脑是完全的*.Unix环境那么可能你需要转而选择另外的一个题目而很难选择这个有趣的主题了。

2. 设计第一个F#程序

Fs

在Visual Studio中选择文件-新建-项目-F#-控制台应用程序 新建一个程序

Fs2

删除其中的示例代码

Fs4

输入如下代码

#light

let square x = x * x
let numbers = [1 .. 10]
let squares = List.map square numbers
printfn "N^2 = %A" squares

open System
Console.ReadKey(true)

按下F5运行

Fs5

接下来介绍一下这段代码的含义

#light 是一个特殊宏,可以暂时不用管,但是绝大部分的F#代码都会需要这个宏

let square x = x * x

这段定义了一个函数square,如果看过C内容的人可能会以为这个函数是定义了一个名叫square的函数,里面的内容是将 x 与 x 相乘再赋值给x,但是这样的理解是不正确的,函数式的一个重要的概念在于他没有传统意义上的变量,因此也不存在赋值(F#可以用特殊的修饰符实现赋值),这段代码的含义是定义了一个函数square 第一个 x 是square 的参数,相当于声明了自变量是什么,因此这段代码真正的含义是,定义了一个以x为自变量的函数square

let square = x * x (x)

接着

let numbers = [1 .. 10]

则定义了一个名叫numbers的列表,其中包括了自然数1到10,可以看到在这里函数和数据的定义没有本质上的区别。

let squares = List.map square numbers

则涉及到了一个比较特殊的概念,在这里可以暂且理解为这里我们通过List.map定义了一个从numbers到squares的映射,而映射的关系就是square函数,

因变量集合 = List.map 映射规则 自变量集合

接下来又是一个与C中非常类似的概念

printf函数

printfn "N^2 = %A" squares

如果对C有一点了解的就会知道,这里的%A是一个占位符,表示我们要把squares这个列表放在%A的位置上并输出到屏幕中

接下来的两行可以暂时理解为让系统等待你输入一个值再退出

open System
Console.ReadKey(true)

那么到这里就完成了你的第一个F#程序了

然而这个程序并没有能够完全展现函数式语言的精髓,只是稍微介绍了一下F#的相关语法,大家想要进一步学习F#的相关知识建议可以去参考MSDN的相关章节,或者上网找相关的博客浏览~

希望大家好好准备二面噜:)

Leave a Reply

Your email address will not be published. Required fields are marked *