9.5 在 C# 中使用 F# 库

像 C# 一样,F# 也是一种静态类型的语言,就是说,编译器知道每个值的类型,以及类方法和属性的签名。对于与 C# 的互操作性来说,这是非常重要的,因为,编译器可以生成代码,看起来就像普通的 .NET 库。

与其他 .NET 语言的互操作性

F# 和 C# 或 VB.NET 之间的互操作性是非常平滑的,相比有 .NET 实现的动态类型的语言,比如 Python、Ruby、JavaScript。这些语言的编译器不知道方法所要求的参数类型,是 int,还是比如Customer,因此,使用 C# 3.0 时,要利用这些语言写的代码是比较困难的。通常,甚至不知道对象是否包含具有特定名字的方法,所以,C# 代码看应该像这样:

obj.InvokeMethod("SayHello", newobject[] { "Tomas" });

这个例子指定方法的名字为一个字符串,并以数组的方式传递参数值给方法。对于许多语言来说,这是一个重要的问题,所以,C# 4.0 引入了动态类型,它允许这样写:

obj.SayHello("Tomas");

obj.SaiHello("Tomas");

这个语法与正常的方法调用相同,但有一个重要的区别。我们还添加另一个方法调用,但故意用了一个不存在的方法名。这将正确编译,因为方法的名字在内部表示成字符串,就像在前面的例子一样。问题要到运行时间才会发现。F# 是静态类型的事实说明,我们不必担心出现这种情况:我们可以依靠编译器发现类似的错误,在调用到其他 C# 代码时。

当创建要在 C# 中使用的 F# 库,我们需要区分两种 F# 构造。第一种包括带成员的类或记录,它就是以标准的 C# 类出现的,使用起来没有任何麻烦;第二种包括值或高阶函数,以非标准方式编译,很难在 C# 中使用。我们先看一个第一种情况的例子。

时间: 2024-10-13 07:02:27

9.5 在 C# 中使用 F# 库的相关文章

在Linux中创建静态库.a和动态库.so

转自:http://www.cnblogs.com/laojie4321/archive/2012/03/28/2421056.html 在Linux中创建静态库.a和动态库.so 我们通常把一些公用函数制作成函数库,供其它程序使用. 函数库分为静态库和动态库两种. 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译

第七章 F# 库(三)

序列(Microsoft.FSharp.Collections.Seq)模块 Microsoft.FSharp.Collections.Seq 模块包含所有处理集合的模块,只要它支持 IEnumerable 接口, .NET 框架的 BCL 中的大多数集合都是的.这个模块之所以称为序列(Seq),是因为序列是IEnumerable 接口的别名,是对其简称,为了读.写更方便.给定类型定义时使用这个别名. 注意 FSLib 包含几个模块,用于处理不同类型的集合,包括Array(数组).Array2(

第七章 F# 库(四)

打印(Microsoft.FSharp.Text.Printf)模块 打印(Printf)模块提供了以类型案例的方式格式化字符串的函数,打印模块中函数的第一个参数是值的占位符,它返回的函数需要为占位符提供值:占位符用百分号加一个表示类型的字母组成,表 7-2 是完整的清单. 表 7-2 打印模块的占位符和标记 标记 描述 %b 布尔型,格式化为 "true" 或 "false" %s 字符串,格式化为它的非转义内容 %d, %i 任何基本整型(即,sbyte, by

第七章 F# 库(五)

事件(Microsoft.FSharp.Control.Event)模块 可以把 F# 中的事件看做是函数的集合,能够通过函数调用来触发.其思想是,函数本身注册成事件,即函数的集合,等待事件发生的通知:然后,触发函数发出事件已经发生的通知,引发所有添加到事件中的函数被执行. 我们将讨论事件模块中的下列功能: 创建和处理事件:使用 create 和 add 函数来创建和处理事件的基础: 筛选(filter)函数:筛选进入事件中数据的函数: 分区(partition)函数:把进入事件中数据拆分成两部

VS2010中添加lib库引用

一.VS2010中添加lib库引用:1 菜单  项目---> 属性--->配置属性-->链接器---->输入---附加依赖项,  加入库名,如: my_API.lib; 或是在cpp源文件中用代码#pragma comment(lib,"my_API.lib")代替. 此时再编译会提示错误:fatal error LNK1104: 无法打开文件"my_API.lib" ,  原因应该是编译器不知道去哪里找我们的这个库,下面就来解决2 然后给项

Python圈中的符号计算库-Sympy(转载)

<本文来自公众号"大邓带你玩python",转载> import math math.sqrt(8) 2.8284271247461903 我们看看Python中结果 math.sqrt(8).math.sqrt(8) 8.000000000000002 本以为会得到8.0,但没想到得到8.000000000000002. 一.为什么会这样? 如果我们平常计算的任务常常有类似于上面的例子这样的表达式,那么直接用python计算其结果只是真实值的逼近.如果这样的计算很大很多,

微服务改造中解决跨库问题的思路

今年一直在和团队做微服务的架构改造(相关的一些详情,有兴趣的朋友,可以参见之前的这篇分享).但是做过改造的朋友都知道 从“All-In-One” 到 “Micro-Service” 都需要迈过的一个坎,那就是垂直分库, 根据不同的子服务,将数据库拆分为不同的子服务库. 那么问题就来了,在开始做微服务改造前,我发现在摇旺的老系统中,有很多后台报表或者前端详情页所需的数据是通过SQL Join来完成的.但是,我们微服务改造后,每个服务背后的数据库已经在分布不同的实例中了,所以我们已经不能继续简单在S

在iOS中创建静态库

如果你作为iOS开发者已经有一段时间,可能会有一套属于自己的类和工具函数,它们在你的大多数项目中被重用. 重用代码的最简单方法是简单的 拷贝/粘贴 源文件.然而,这种方法很快就会成为维护时的噩梦.因为每个app都有自己的一份代码副本,你很难在修复bug或者升级时保证所有副本的同步. 这就是静态库要拯救你的.一个静态库是若干个类,函数,定义和资源的包装,你可以将其打包并很容易的在项目之间共享. 在本教程中,你将用两种方法亲手创建你自己的通用静态库. 为了获得最佳效果,你应该熟悉Objective-

详解Xcode7中创建静态库

今天和大家一起来谈谈Xcode中的静态库,包括什么是静态库,如何在Xcode中创建静态库等内容,希望这篇Xcode教程 http://www.maiziedu.com/course/234/对打击有帮助. 一.静态库和动态库的区别: 静态库和动态库是相对编译期和运行期的,静态库以 .a 和 .framework 形式存在,链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝:动态库以 .dylib 和 .framework 形式存在,链接时不复制,程序运行时由系统动态加载到内存