2.4.1 C# 和 F# 中的类型推断

2023-11-07

2.4.1 C# 和 F# 中的类型推断

 

大多数的类型有简称,例如 int 或 Random,只有很少一部分需要类型推断,因为手写类型名称并不困难。C# 2.0 支持泛型,因此,可以构造更复杂的类型。在函数语言中的类型,像 F#,是相当复杂的,尤其是把函数当作值使用,因此,还必须有一种类型来表示函数。

在 C# 3.0 中,可以对局部变量进行简单形式的类型推断。在C# 的早期版本中,声明局部变量必须显式指定类型;在 C# 3.0 中,通常可以用新的关键字 var 代替类型名称。我们来看两个基本的示例:

 

var num = 10;

var str = "Hello world!";

 

第一行声明变量 num,并初始化为 10。编译器很容易就能推断出表达式的右边是 int 类型,因此,变量的类型也必须是 int。注意,此代码的意思与显式写出类型是完全相同样的。在编译期间,C# 编译器用实际类型替换 var,所以,在运行时不需要做额外的工作。我们曾说过,这对于处理复杂泛类型特别有用。例如,我们可以写下面的代码:

 

var dict = new Dictionary<string,List&lt;IComparable&lt;int>&gt;&gt;();

 

如果没有 var 关键字时,就必须在一行上两次指定类型:

■在声明变量时

■创建 Dictionary 类的实例时

在 C# 中的类型推断仅限于局部变量的声明;而F# 中,通常根本不要写出任何类型。只有当 F# 的类型推断无法推断出某种类型时,才需要显式指定类型,但很少出现这种情况。

为了更好地理解其原理,清单 2.5 用一个简单的函数进行演示,它有两个参数,相加,再用 String.Format 方法将结果格式化。清单的前面是有效的 F# 代码,那么,如果C# 中隐式类型被扩展,能够在其他地方使用 var 关键字,该如何写呢?

 

清单2.5 实现有类型推断的方法

 

let add a b =     [1]

  letres = a + b  [2]

  String.Format("{0}+ {1} = {2}", a, b, res)  [3]

 

var Add(var a,var b) {                                                                      |  [4]

  var res = a + b;                                                                             |

  return String.Format("{0} + {1} ={2}", a, b, res);                 |

}

 

可以看到,F# 的语法被设计成,在源代码中根本不必写任何类型[2]。在我们假想的C# 版本中[4],我们用 var 关键字代替所有的类型,(原则上),你输入的这段代码,就是 F# 编译器所看到的。如果将这个函数的代码粘贴到 F# Interactive,会被正确处理,F# Interactive 将报告函数有两个整数作为参数值,并返回一个字符串。我们看看 F# 编译器是如何得出这个结论的。

编译器的第一个线索是,我们要相加的值 a 和 b[2]。在 F# 中,我们可以用 + 对任何数值类型进行相加,或连接字符串,但如果编译器不知道值是什么类型,会假定相加的是两个整数。从这一个表达式来看,编译器可以推断出 a 和 b 都是整数。使用这个信息,可以找到 String.Format 方法对应的重载[3],这个方法返回字符串,因此,编译器可以推断出,add 函数的返回类型也是字符串。

由于有了类型推理,可以避免很多错误,也能使用静态类型的所有其他好处(比如,开发人员编写的代码时的提示),几乎无需付出,因为在大多数情况下,类型是自动推断的。使用 Visual Studio 中的 F#,类型推断在后台运行,因此,当将鼠标指针悬停在某个值上,会立即看到它的类型。后台编译还能即时报告所有的输入错误,因此,能得到写 C# 代码时的相同体验。

如果你习惯使用过其他编程语言的类型,可能已经知道类型包括基元类型(如整数、字符,或浮点数),和由这些基元类型组成的复杂类型。函数语言有一组稍许不同的复合类型,我们会在第五章详细讨论这些类型,现在,我们先讨论一个特别有意义的类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2.4.1 C# 和 F# 中的类型推断 的相关文章

  • F# 的 timeit 函数

    我想写一些类似的东西 let timeit x a gt b let start System DateTime Now x let duration System DateTime Now start printfn time usage
  • 从传递给 C# 的 F# 列表中检索项目

    我在 C 中有一个在 F 中调用的函数 将其参数传递到Microsoft FSharp Collections List 如何从 C 函数中的 F 列表中获取项目 EDIT 我找到了一种 函数式 风格的方式来循环它们 并且可以将它们传递给如
  • 实现领域驱动设计的函数式方法

    我在使用 C 编写领域驱动应用程序方面拥有丰富的经验 我编写的应用程序越多 我就越发现我想要采用一种不太适合标准 C OO 技术的方法 我想编写尽可能多的纯函数 因为它们真的很容易测试 我想以更具声明性的方式编写我的业务逻辑 所以我一直在研
  • 从 F# 中存储为概率序列的离散分布函数中抽取随机数

    存在给定的有限长度 N 的浮点序列 介于 0 和 1 之间 表示整数 0 N 1 上的分布函数 我们试图从这个分布中抽取一个随机数 一种方法是在 0 1 浮点数 中绘制一个均匀随机变量 然后计算该数字的逆累积分布函数 如果分布在数组中 则代
  • Silverlight 如何确定程序集是“Silverlight”?

    我正在尝试从 F 编译代码以在 Silverlight 中使用 我编译 noframework cliroot C program Files Microsoft Silverlight 2 0 31005 0 standalone 这会生
  • F#:将字符串选项转换为字符串的最短方法

    目标是转换一个string option这是通过一些很好的类型计算得出的一个简单的string然后可以传递到 UI printf URL 其他只想要一个字符串并且对选项类型一无所知的东西 None应该变成空字符串 显而易见的方法是做一个ma
  • F# 设置带有参数的 SQLCommand 的最佳方法

    我的 F 程序需要与 SQL Server 通信 在一部分中我有这样的事情 let workFlowDetailRuncommand new SqlCommand query econnection workFlowDetailRuncom
  • F# 中的组总计 - 使用序列很容易,可以使用列表吗?

    给定一组 id value 元组序列 很容易计算组总数 与使用 C 和 LINQ 执行此操作的方式几乎相同 let items g1 5 g2 10 g1 20 let groupsums items gt Seq groupBy fun
  • 如何在 F# 列表和 F# 元组之间进行转换?

    有没有办法在 F List 和 F Tuple 之间进行转换 例如 1 2 3 gt 1 2 3 1 2 3 4 gt 1 2 3 4 我需要两个函数来做到这一点 let listToTuple list let tupleToList t
  • 双前向/后向管道操作符是否有记录?

    我记得读过有关双管道运算符的内容 gt 和 Example let print a b sprintf O O a b 1 2 gt print val it string 1 2 双 向前 向后 管道运算符记录在以下列表中MSDN 上的
  • F# 中序列的递归函数

    这是一个相当微不足道的问题 但快速的谷歌搜索并没有给我答案 为序列编写递归函数的标准方法是什么 对于列表 您可以使用空列表和头 尾模式进行模式匹配 序列的等效项是什么 没有标准的方法可以做到这一点 因为您很少为序列编写递归函数 您应该查看各
  • 在 Blazor 中显示计时器

    我正在尝试在服务器端 Blazor 应用程序中显示倒计时器 我的代码同时使用 F 和 C 语言 该代码在某种程度上可以工作 但计时器永远不会按预期停止 并且计时器显示偶尔不会呈现所有数字 这是我第一次尝试 Blazor 服务器端应用程序 我
  • F# 2010 Seq.generate_using

    Visual Studio 2010 中的 Seq generate using 是否有替代 解决方法 FSharp PowerPack dll 不适用于 2010 AFAIK 很抱歉 2010 年的 PowerPack 尚未上市 我不记得
  • 如何在MVVM中实现appSettings

    我正在尝试摆脱我使用的警告appSettings在 WPF 项目中 应用程序配置
  • 当两个模式共享“when”子句时,模式匹配不完整

    A 共同的惊喜 https stackoverflow com q 18691622 2314532对于 F 初学者来说 以下事实是不完全匹配 let x y 5 10 match something with when x lt y gt
  • F# 正确使用序列缓存

    我正在尝试将 Seq cache 与我制作的函数一起使用 该函数返回最多为 N 的素数序列 不包括数字 1 我无法弄清楚如何将缓存的序列保留在范围内 但仍然使用它在我的定义中 let rec primesNot1 n 2 n gt Seq
  • 将属性应用于返回值 - 在 F# 中

    在 C 中 可以将属性应用于方法的返回 return DynamicAttribute public object Xyz return new ExpandoObject 这在 F 中可能吗 背景 我想要一个用 F 编写的库的方法 该方法
  • Async.StartChild是否存在内存泄漏?

    当我运行以下测试 使用 F 2 0 构建 时 我得到 OutOfMemoryException 在我的系统上大约需要 5 分钟才能达到异常 如果它作为 x86 进程运行 则为 i7 920 6gb ram 但无论如何我们都可以在任务管理器中
  • 单位安全平方根

    我只是想知道如何以与 F 正确交互的方式编写用户定义的平方根函数 sqrt 单位制 http blogs msdn com andrewkennedy archive 2008 09 04 units of measure in f par
  • 从 F# 调用 Newtonsoft.Json 出现意外结果

    我没有从该 F 代码中获得预期结果 我希望 t 包含调用 JsonSchema Parse json 的结果 但它是空的 我究竟做错了什么 open Newtonsoft Json open Newtonsoft Json Schema l

随机推荐

  • 深入解构objc_msgSend函数的实现

    阅读本文后你将会进一步了解Runtime的实现 享元设计模式的实践 内存数据存储优化 编译内存屏障 多线程无锁读写实现 垃圾回收等相关的技术点 objc class Class对象 结构简介 熟悉OC语言的Runtime 运行时 机制以及对
  • spark应用tips

    1 正常sprkui会在scan和exchange都有数据显示 前者是条数 后者是存储 如果不显示说明这个阶段没有数据 2 stats size 是逻辑上基于读取表存储估算的可能广播的数据大小 data size 是执行期间 根据shuff
  • [linux] shell 输入/输出重定向 、 文件包含

    Shell 输入 输出重定向 大多数 UNIX 系统命令从终端接受输入并将所产生的输出发送回 到终端 一个命令通常从一个叫标准输入的地方读取输入 默认情况下 这恰好是自己的终端 同样 一个命令通常将其输出写入到标准输出 默认情况下 这也是自
  • flask 视频流直播

    flask 视频流直播 本文将介绍如何本地通过浏览器查看远端服务器的摄像头采集到的视频 服务端 实现实时视频流式传输主要采用服务器推送技术 服务器在响应请求时 HTTP使用MIME报文格式来封装数据 通常一个HTTP响应只能包含一个数据块
  • 关于 Error: Cannot find module ‘webpack/lib/RuleSet‘ 的详细解决方法(亲测有效)- 以及删除脚手架的方法

    对于出现的这个错误 之前我也尝试了网上的多种解决方案 最终经过测试后 是通过将原来的 vue cli 版本降级到 4 5 15 版本 最后再重新安装 node modules 包 才得以解决 下面是我将介绍怎么安装 4 5 15 版本的脚手
  • linux svn 用户名存储,Linux下SVN账户密码保存设置

    Linux下用SVN进行更新等操作时 总是提示输入用户名和密码 很不方便 因此搜了下解决办法 总结如下 Linux下用SVN进行更新等操作时 总是提示输入用户名和密码 很不方便 因此搜了下解决办法 总结如下 打开SVN配置文件 vim ho
  • SQL注入(2)——各种注入

    本专栏是笔者的网络安全学习笔记 一面分享 同时作为笔记 前文链接 WAMP DVWA sqli labs 搭建 burpsuite工具抓包及Intruder暴力破解的使用 目录扫描 请求重发 漏洞扫描等工具的使用 网站信息收集及nmap的下
  • 亲密关系沟通-【独特性】尊重与探索他人

    忽视自己是逃避 忽视对方也是逃避 故事 理发师抱怨老婆不换空调 你有没有问过她 为什么不愿意换 谁知道她怎么想的 你承认对方的独特性 就不用做任何改变 叙述测试 你讲述经历里的别人有ta的想法吗 如何把对方从一个活生生的人变成ta就是那样的
  • HTTPS为什么安全 &分析 HTTPS 连接建立全过程

    本文将分两个专题去理解HTTPS 专题一 HTTPS为什么安全 1 http为什么不安全 http协议属于明文传输协议 交互过程以及数据传输都没有进行加密 通信双方也没有进行任何认证 通信过程非常容易遭遇劫持 监听 篡改 严重情况下 会造成
  • WSL无法保存文件(权限不足)

    sudo chown R username 其中username是你的用户名
  • windows vscode 安装+配置go环境

    一下载 go语言官方下载地址 https golang org dl 找到适合你系统的版本下载 本人下载的是windows版本 也可以下载Source自己更深层次研究go语言 二安装 一路next 三 安装后目录 Go语言安装之后 C Go
  • WebApi 打个Attribute 统一处理异常

    我们处理异常的时候通常都要写形如以下的代码 try xxxxx catch Exception ex log write ex Message 前一段时间看杨中科的视频 其中吐糟了 mvc 的管道机制 当然用在web ui 的渲染上这个还不
  • Buck电路基础知识

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net weixin 42005993 article details 120144144 这
  • Windows下libmodbus库的编译和使用

    一 前言 最近要搞一个PC端Qt上位机控制机械手的移动 需要用到串口io卡 控制的话需要使用libmodbus库 就想着自己编译一下libmodbus库 过程如下 二 编译过程 2 1 libmodbus的下载和安装 下载地址 https
  • pytorch7-可视化训练过程(过程中显示)

    import torch import torch nn as nn import torchvision import torchvision utils as vutils from torch optim import SGD imp
  • 安全连载——CSDN区块链大本营出品

    史上杀伤力最大的溢出型漏洞到底是什么 看这一篇就够了 第1期 4月发生的BEC事件以及SMT事件已经沉淀一段时间了 具体的情况也被多方媒体所报道 相关的漏洞根源问题也有很多大神团队的分析和指正 近日 有安全团队将各种已经发生或可能发生的类似
  • Marshaller和Unmarshaller用法示例

    import java io FileNotFoundException import java io FileOutputStream import java io OutputStream import javax xml bind J
  • Qt之QDialog禁用右上角关闭按钮

    setWindowFlags windowFlags Qt WindowCloseButtonHint
  • 【深度学习】笔记12:win10下的VS2013编辑代码的时候,非常卡顿,怎么样解决?

    给新电脑连续配置了三天环境 双系统下的caffe和NVIDIA环境配置好之后 终于可以看代码了 结果在vs2013下对代码进行注释的时候 代码编辑器用起来非常卡顿 这个问题的解决方法如下所示 1 首先确定是不是硬件和系统的问题 据说win8
  • 2.4.1 C# 和 F# 中的类型推断

    2 4 1 C 和 F 中的类型推断 大多数的类型有简称 例如 int 或 Random 只有很少一部分需要类型推断 因为手写类型名称并不困难 C 2 0 支持泛型 因此 可以构造更复杂的类型 在函数语言中的类型 像 F 是相当复杂的 尤其