前言:

正如你在第三章看到的,你可以使用F#作为纯函数编程。然而有些问题,最明显的是I/O,没有状态的改变几乎是不可能的。F#不要求你的程序是一个无状态的模式。它允许你使用可变(mutable)标识符,其值可以随时间而改变。F#还支持命令式编程的其他结构。在第三章你已经看到一些例子。任何输出到控制台的例子都包含一些命令式代码在函数式代码旁。在本章中,我们将探索这些结构,和更多其他结构,及其更多细节。

首先,先了解F#的unit类型,这种特殊的类型意味着“no value”,是命令式编程特有的。接下来,你将看到F#里处理可变状态的一些方法,也就是说,可以随时间改变值的类型。这些都是ref类型,可变记录类型和数组。最后,你将看到使用.NET库。包括调用静态方法,创建对象和其成员的方法,使用特殊成员如索引和事件,并使用F#的|>操作符,非常方便的处理与.NET库的交互。

正文:

任何不接收值或返回值的函数是unit类型,这类似在C#中的void类型和CLR中的System.Void。对于函数式程序员,一个函数不接收值或返回值似乎没有任何意义,因为如果它不接收或返回一个值,它什么都不做。在现实的世界中,你知道存在副作用,因此,即使一个函数接收或返回nothing,你知道它仍然有它的用途。unit类型代表一个常量,一对括号“()”。这意味着,每当你想要一个不接收值或返回值的函数,你只要在()里放入代码:

#light
let main() =
    ()

在这个例子中,main是一个函数,因为你把括号放在标识符后,成为其参数。如果没有这一点,将意味着main不是一个函数而仅是一个非函数的值,如你所知,所有函数都是值,但在这里,一个函数和一个非函数的值之间的差别是重要的。如果main是一个非函数的值,在它里面的表达式将只计算一次。然而它是一个函数,表达式将在每次调用时计算一次。

注意:仅仅因为一个函数的名字是main并不意味着它是程序的入口点并自动执行。如果你想要main函数执行,那么你需要在源文件最后添加对mian()的调用。第六章将详细介绍如何定义F#程序的入口点。

同样,放置在等号后的(),告诉编译器,你将返回nothing。通常情况下,你需要放置一些东西在等号和空括号之间,或空函数;为了保持简单,我们将留下这个空函数。现在可以看到使用fsc -i开关的main类型;结果如下,正如你所看到的,main类型是一个函数,接收unit并返回unit类型的值。

val main : unit –> unit

因为编译器知道该函数不返回任何东西,你可以使用一些特殊的命令式结构。调用这个函数,你可以使用let关键字,然后是一对括号和等号。这是let关键字的一种特殊用法,意味着“调用一个不返回值函数”。另外,你可以简单的只调用函数,不需要任何多余的关键字。

#light
let () = main()
// -- or --
main()

同样,你可以链接一些返回unit的函数到一个函数里---确保他们有相同的缩进。下一个例子显示了几个print_endline函数的链接,打印文本到控制台:

let poem() =
    print_endline "I wandered lonely as a cloud"
    print_endline "That floats on high o'er vales and hills,"
    print_endline "When all at once I saw a crowd,"
    print_endline "A host, of golden daffodils"
poem()

这种方式只可以使用返回unit类型的函数,并不完全正确;然而,使用其它类型而不是unit会产生一个警告,这点是大多数程序员都希望避免的。因此,为了避免这种情况,有时转换一个不返回一个值的函数到一个unit类型函数非常有用的,因为它有一个副作用。在使用F#库编写F#时这相当罕见,但在使用.NET库编写F#时则较为常见。

下面的例子演示如果把一个返回一个值的函数链接到一个返回unit的函数,或者说如果用返回unit的函数调用一个返回一个值的函数:

#light
let getShorty() = "shorty"
let _ = getShorty()
// -- or --
ignore(getShorty())
// -- or --
getShorty() |> ignore

首先,你定义函数getShorty,返回一个字符串。现在想象一下,由于某种原因,你想调用这个函数但忽略其返回。接下来的两行演示做到这一点的不同方式。首先,你可以使用let表达式,用下划线字符(_)在标识符的地方,下划线告诉编译器,你对这个值不感兴趣。第二方法,是上面的过程被包裹为一个函数,ignore,这在F#基础库里定义。最后一行显示调用ignore的另一种方法,使用pass-forward操作符来传递getShorty() 的结果给ignore函数。说明pass-forward操作符在”|>操作符”一节。(pass-forward意思即通过、向前。也附带传递的意思)

转载于:https://www.cnblogs.com/IBBC/archive/2011/12/07/2279985.html

F#基础教程 unit类型相关推荐

  1. F#基础教程 ref类型

    ref类型是在一个程序里使用可变状态的一种简单的方式,也就是说,可以随时间改变的值.ref类型仅仅是一个纪录类型的单一可变字段,在F#库中.访问和更新字段的一些操作符的定义都很简单.F#的ref类型定 ...

  2. F#基础教程 定义mutable记录类型

    在第三章,你第一次接触了记录类型,我并没有讨论如何更新它们的字段.这是因为,默认情况下记录类型是不可更改的.F#提供了特殊的语法,以允许更新记录类型里的字段,在记录类型的字段前面使用关键字mutabl ...

  3. F#基础教程 大纲

    各位大虾,原文的pdf文档在这里下载. 第一章 简介 什么是函数式编程 为什么函数式编程很重要 什么是F# 谁在使用F# 谁需要这本书 下一步是什么 第二章 如何获取.安装和使用F# 获取F# 在wi ...

  4. F#基础教程 列表

    F#中的列表是F#内置的简单集合类型.一个F#列表可以为空,用方括号代表([]),也可以是一组值的串联.你可以使用F#内置的操作符(::)串联一个列表.下面的例子给出一些示例,开始第一行为空列表,第二 ...

  5. 计算机基础教程3 - 类型分类

    计算机可以根据其速度和计算能力进行大致分类. S.No. 类型 产品规格 1 PC(个人电脑) 它是具有中等功能的微处理器的单用户计算机系统 2 工作站 它也是单个用户计算机系统,类似于个人计算机,但 ...

  6. F#简明教程二:F#类型系统和类型推断机制

    [51CTO独家特稿]在上一篇教程<F#与函数式编程概述>中我们了解到F#和函数式编程的一些特点,更多关于F#语言和函数式编程的介绍可以参考51CTO之前对微软MVP赵颉老师的专访< ...

  7. Xamarin图表开发基础教程(12)OxyPlot框架支持的金融图表类型

    Xamarin图表开发基础教程(12)OxyPlot框架支持的金融图表类型 OxyPlot组件中支持5种类型的金融图表,它们分别为销量图.高低图.股票K线图.股票走势图和旧式股票图,如图1.20~1. ...

  8. Xamarin图表开发基础教程(11)OxyPlot框架支持的图表类型

    Xamarin图表开发基础教程(11)OxyPlot框架支持的图表类型 OxyPlot组件中支持7种类型的条型图表,分别为普通条形图.线型条形图.矩形条形图.差值图.龙卷风图.普通柱形图和柱形误差图, ...

  9. Xamarin图表开发基础教程(10)OxyPlot框架支持的图表类型

    Xamarin图表开发基础教程(10)OxyPlot框架支持的图表类型 OxyPlot组件支持26种图表,这些图表按照功能和样式可以分为4大类,分别为线型图表.条型图表.金融图表和其它图表. 线型图表 ...

最新文章

  1. 4.8 代价函数-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  2. HTML中引入CSS的方法
  3. 微信小程序_基础组件学习02
  4. 关于浏览器跨域请求的相关原理实现--很经典的博客
  5. Android 友盟分享躺过的几个坑,大坑,坑爹啊
  6. datatables 获取筛选后的数据
  7. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 12丨销售分析 III【难度简单】
  8. ioc控制反转_深入理解依赖注入(DI)和控制反转(IOC)
  9. Socket通信客户端设计(Java)
  10. %lf 和 %f 有什么区别
  11. 学完python能做什么-学完Python开发可以从事哪些行业?
  12. python解压文件(自用)
  13. 精妙的SQL和SQL SERVER 与ACCESS、EXCEL的数据导入导出转换
  14. SAP操作手册之 IDOC基础篇
  15. 0基础学习3dmax游戏建模有这4个技巧
  16. python面试整理
  17. python如何拼读英语单词怎么写_怎么用英标快速拼读英语单词,这些技巧你知道吗...
  18. 案例4加减乘除四则运算
  19. SpringMVC——过滤器
  20. 美术集速写模特姿势参考大全,又酷又飒的姿势你画过了吗?

热门文章

  1. 新颖性搜索(Novelty Search,NS)算法实践——利用NS算法解决迷宫导航问题
  2. 更新sql语句 sql注入_SQL更新语句– SQL中的更新查询
  3. Win7系统主题路径
  4. ROS的学习(二十一)使用时间和TF
  5. 云原生技术的挑战是什么?
  6. 一步步了解线程池之自定义-PriorityThreadPool
  7. 基于算法的建模--小结
  8. 实践 | Sentinel 扩展性设计 1
  9. HDU 3008 Warcraft
  10. hdu Robberies