【51CTO独家特稿】在上一篇教程《F#与函数式编程概述》中我们了解到F#和函数式编程的一些特点,更多关于F#语言和函数式编程的介绍可以参考51CTO之前对微软MVP赵颉老师的专访《TechED 09视频专访:F#与函数式编程语言》。本节教程我们将学习到F#的一些基础原理,在开始之前,让我们先温习一下我们的Hello World代码:
  1. #light
  2. System.Console.WriteLine(“This is one hello”)
  3. printfn “This is another hello”
F#是函数式和面向对象的混合体。它有时候会看起来与C#或Visual Basic惊人的相似,但却又完全陌生。F#程序以一系列的表达式形式组成,每个表达式可以通过“let”标识符被指定,比如:
  1. let fles = System.IO.DirectoryInfo(@”C:\Users\Chance”).
  2. GetFiles()
在上面的代码中,“fles”被指定了一个值,在这个例子中,是一个文件路径。有意思的是,程序运行中,直到语句在得到右侧的返回值前,“fles”的实际类型都没有被详细定义。你可能觉得有些别扭,在Java或其他编程语言中,变量fles应该被定义成一种数据类型,string或是其他什么类型以在内存中可以明确的被编译器区别对待,但这些规则在F#中有些不同。这也导致我们的F#简明教程稍有不同,我们不会像通常的教程那样介绍F#的基本数据类型,从某种意义上说,F#可以是任意类型或只有一个类型。
F#小提示:F#是一种类型推断语言,它们在编译过程中被推断和确定。如果你在Visual Studio中编写F#,将鼠标指向某个值就会得到它的类型,编译器可以通过函数体或其他方式的定义推断出类型;Visual Studio是开发F#的主要工具,51CTO推荐您阅读Visual Studio 2010中关于F#的资源一文。
类型推断(Type Inference)
我们说数据的类型是被推断出的,因为F#的编译期进程会试图根据变量自身的特点来判断出它的类型并确保这种类型是安全的。尽管F#是强类型语言,但变量的类型声明在类型的判断推理过程中并不是必须的。
类型推断有自身的优点。在使用F#开发一些大型应用时,比如.NET和Java开发者都很熟悉的泛型特性(Generics)便是由类型推断来完成。注意,F#编译器会视任何没有类型标注的表达式为泛型。例如,下面的函数中,各变量的类型被定义(推断为)泛型,即使程序编写者没有定义任何类型。
  1. let f x =
  2. let y = g x
  3. h y
  1. let f (x:’a) : ’b =
  2. let y:’c = (g:’a->’c) x
  3. (h:’c->’b) y
F#小提示:在F#中,泛型类型参数是一个以撇号为前缀的字符。比如上面例子中的’b和’c就是最常用的泛型参数。像在.NET中一样,泛型类型也可使用尖括号语法,比如“Dictionary<’Key,’Value>”。只有一个泛型参数的时候,你有时候会看到它使用‘前缀’语法而不是尖括号——最常见的是和F#泛型类‘list’和‘option’一起使用。比如“int list”和“list<int>”表达同一种功能,只是书写方式不同。
F#类型推断机制
F#语言中的大多数类型推断可以遵循以下两条规则。首先,如果一个函数用于产生一个值,编译器将假定该值的类型是函数需求的。第二,如果一个值是一个表达式的必然结果,这个值的类型是这个表达式所决定的。
有些情况下这些简单的规则不够完全,编译器必须需要类型声明。比如,当一个算数运算符被使用,F#会处理的非常谨慎,如果没有程序员的明确代码,不会将一个数值型赋予另一个。这样做是为了确保F#在进行大规模数值计算时,类型推断不会加重编译器的负担。
针对第二条规则的例子在方法过载的情况下发生。比如Write方法在System.Console(.NET中System.Console封装了基于控制台应用程序的输入、输出和错误流操作)中有18个负载。类型推断可以确定传送给它的类型,但是无法确定另一个方向传送的值的类型。
类型推断不只是简单的符号,它还可以用于程序功能的检测。当你写了一段代码,类型推断功能为这些代码智能的获得了指定的类型,这意味着错误不会被引入程序。这种机制使F#获得动态语言的代码简洁性的同时保证了完全静态的类型系统。
更多关于F#的类型和语法基础请参考:
◆ F#数据类型:Discriminator Union
◆ F#基本语法,模式匹配及List
F#的类型系统和类型推断机制是学习和理解F#语言的基础,掌握了这些有利于我们之后的学习。下周我们将继续F#的学习,一起探究F#的基础语法。

转载于:https://blog.51cto.com/hong7/267531

F#简明教程二:F#类型系统和类型推断机制相关推荐

  1. Linux下CMake简明教程(二)同一目录下多个源文件

    代码在git 接下来进入稍微复杂的例子:在同一个目录下有多个源文件.在之前的目录下添加2个文件,testFunc.c和testFunc.h.添加完后整体文件结构如下, (base) ledi@ledi ...

  2. 【Python简明教程二十五】日期

    1 Python 日期 Python 中的日期不是其自身的数据类型,但是我们可以导入名为 datetime 的模块,把日期视作日期对象进行处理.Python中日期内容丰富,这里主要讲datetime模 ...

  3. C#开发GIS应用简明教程(二)

    第二章入门 1.工具(ToolConstants) 在上一章里我们试着做了一个将地图放大的应用程序.在这章里,我们将接触到更多的工具,并介绍自定义工具. MapX为开发人员提供一系列的工具,这些工具的 ...

  4. 【Python简明教程二十八】PIP

    1 概述 PIP 是 Python 包或模块的包管理器. 注释:如果使用的是 Python 3.4 或更高版本,则默认情况下会包含 PIP. 2 包(Package) 包中包含模块所需的所有文件. 模 ...

  5. [静态时序分析简明教程(三)]备战秋招,如何看懂一个陌生的timing report

    备战秋招,如何看懂一个陌生的timing report 一.写在前面 1.1 快速导航链接· 二.Timing Report 2.1 起始点与终止点 2.2 路径时钟域的归属 2.2 建立时间检查与保 ...

  6. Kafka—简明教程

    目录 学习目标: 一.Kafka发展历程 1.Kafka一代 - 消息队列 2.Kafka二代 - Partition 3.Kafka三代 - Broker集群 二.Kafka的消息结构? 三.Zoo ...

  7. Linux/Unix系统下nginx+php安装简明教程

    本文转载自Linux/Unix系统下nginx+php安装简明教程,请保留转载信息~ 一.安装nginx: 1. 安装pcre库,nginx的rewrite模板需用到pcre库: mkdir -p / ...

  8. [静态时序分析简明教程(一)] 绪论

    静态时序分析简明教程一:绪论 一.写在前面 1.1 快速导航链接· 二.什么是静态时序分析 三.为什么需要时序约束 四.约束的第一步:综合 4.1 什么是综合 4.2 综合与时序约束的关系 4.2.1 ...

  9. 静态时序分析简明教程(七)]端口延迟

    端口延迟 一.写在前面 1.1 快速导航链接· 二.端口延迟 2.1 输入有效 2.2 输出有效 2.3 set_input_delay 2.3.1 -clock clock_name 2.3.2 - ...

最新文章

  1. php上传视频文件代码,php上传视频的代码
  2. Qt Creator加States
  3. 4 C++对C的加强之namespace命名空间
  4. java 重试_Java重试机制修改
  5. 2016重庆计算机一级考试题型,重庆计算机一级考试真题2016年最新(笔试+上机).doc...
  6. 本地提交到yarn_Flink on Yarn三部曲之三:提交Flink任务
  7. 页面滚动到某一位置吸顶_vue监听滚动事件某元素吸顶或固定位置显示详解
  8. java并发编程实战读书笔记4--生产者消费者模式和队列
  9. vue中引入高德地图获取坐标
  10. 计算机硬件 系统安装维护教程 02安装基础篇-02:MBR与GPT、分区、活动分区
  11. [应用广播], 一览华夏文化,诗词三万首震撼上线
  12. php 微信朋友圈 更新时间,微信朋友圈可见天数怎么设置
  13. 【“笨办法”学Python】27.记住逻辑关系——布尔逻辑表达式
  14. 三个月来美国又有一万家餐馆因疫情倒闭或关闭;爱彼迎帮助在危机中的人寻找临时住宿 | 美通企业日报...
  15. 20年3月27日,Github被攻击。我的GitPage博客也挂了,紧急修复之路,也教会你搭建 Jekyll 博客!
  16. OpenCV对TBB的支持
  17. 【翻译】在Windows上直接查询SRV方式的地址
  18. 大厂程序员能力修炼手册,从筑基到化神要多久?
  19. 路径规划服务基于java实现
  20. 为知笔记有linux版本吗,为知笔记linux版本

热门文章

  1. Cocos Studio 2.3.2不再支持直接导入PSD文件
  2. 黄聪:Wordpress程序Mysql查询导致CPU100%,页面错误增量飙高解决方案
  3. Java编写的测试加法计算的工具
  4. 浅谈.net remoting 与webservice
  5. Kafka 时间轮的原理和实现
  6. SpringCloud Hystrix的超时时间配置以及监控平台搭建
  7. RandomAccessFile类的简单介绍,以及代码演示
  8. golang生成随机定长的验证吗
  9. 深入理解Golang之context
  10. git flow 命名规范 驼峰_图解ThinkPHP5框架(一):基础知识,开发规范与目录结构