摘要:异常 (Exception) 的定义跟 Union 的很相似。它是使用 exception 关键字来定义的。 定义的时候首先应该给予异常的名字,然后是相应的参数。 下面是一个定义的例子 [代码] 而要引发一个异常,你可以使用 raise 关键字,捕获异常则使用 try ... with,下面看一个示例 [代码]这里是一个简单的例子,如果是当前秒数是素数,则抛出默认的Failure异常, 否...
阅读全文
摘要:备忘,其实是想知道该进程使用的内存状况。首先要获取系统的内存信息:[代码]因为我下面使用的方法来获取的进程信息,只能知道该进程占内存的百分比。所以必须先获取内存的总量。接下来定义一个获取进程信息的函数。[代码]接着使用 ipython ,测试 ,先开一个 python 进程 ,假设进程ID为2168,则:[代码]记录完毕。Over~
阅读全文
摘要:Union 可以将具有不同含义或不同结构的数据绑定在一起。 他的使用方式我用例子来讲解吧。 [代码] 看起来好像什么用也没有,是吧,别急,我们先来看看他的模式匹配。 [代码] 这里的模式匹配它可以接收一个范式定义的 Volume,然后判断他的类型,是Liter 还是 UsPint 或 ImperialPint ,然后对其做不同的处理。 嗯,还是感觉不到他的魔力,好吧,看下一个例子。 这个是...
阅读全文
摘要:F# 的类型系统提供了多种方法来让我们定义自己的类型。而所有的类型最后还是归于两种, 一种叫 Tuple 或者是 Records,他们跟 C 的 Struct 与 C# 的 Class 很相似。 另一种则是 sum 类型,有时他们也指 Union 类型。 下面我们先讲 Record Tuple 是一种快速且简易的方式帮助我们将各个值封装到一个组里。而且也提供了方法让我们将 Tuple ...
阅读全文
摘要:今天跟个朋友讨论了下Nullable。 在此列入笔记稍作记录。 在.net 3.0之后便引入了 值类型?的写法,例如 int?,float?等,其表示为可为空的值类型。 对于任何一个值类型的可空类型,其实现都是来自于 Nullable<T> 这个泛型的实现,而Nullable事实上是一个Struct。 所以有时有人会有疑问,如果int?只是一个Struct的实现。那为什么以下代码...
阅读全文
摘要:模式匹配 (Pattern Matching) 模式匹配允许你通过一些定义的标识符的值来执行不同的算法步骤,他有点像之前的 if ... then ... else,也可能跟类似 C++ 跟 C# 的 switch,但更加强大。 下面我们来看一个例子: [代码] printfn "(luc 2) = %i" (luc 2) printfn "(luc 6) = %i" (luc 6) ...
阅读全文
摘要:F# 是一门强类型的语言,这意味着你不可以使用一个不适合的参数来调用一个函数。 你必须在必要的时候进行适当的类型转换,或必须使用匹配的类型。 一般来说,你不需要特别的区声明一个类型,因为编译器会自动帮你推断类型。 比如自动帮你推出一个函数的参数或者他的返回值会是什么类型。 除非编译器无法推断出这个代码块需要的类型,或是当前的代码块可能会有多种匹配方式, 才会需要你去声明这个类型。 下面的例子...
阅读全文
摘要:F# 有相较于其他的单纯的函数式语言来说比较其他的控制流。从以下的 if ... then ... else 表达式 中你就能看出来。 在 F#中 if .. then .. else 结构可以是一个表达式,这表示他可以返回一个值。一或两个不一样的值可以从表达式 中返回,这取决于你 Boolean 表达式的值。下面我们看一个例子。[代码] F# 的类型系统要求在 if ... then ....
阅读全文
摘要:这次我们介绍一些列表初始化跟操作的便捷方式 你可以使用一些特殊的语法来初始化 list,sequences跟arrays(list我们就知道了,而sequences 则对应 .net 的 IEnumerable 类型, arrays后面的章节会介绍) 最简单的初始化一个连续的列表方法是使用 ..,看示例 [代码] 可见,[x..y..z]中,x为初始值,y为步长,z为结束值 即最后的列表...
阅读全文
摘要:F#的列表是一种简单的内置集合类型。F#的列表可以是一个空的列表([]),或者是一些值的集合 你可以用 :: 来连接许多的项 [代码] 你也可以在初始化列表的时候使用;来分隔列表里的项 [代码] F#还提供了 @ ,你可以用这个操作符来连接两个列表 [代码] 在同一个列表里的项都必须是同一个类型的,如果你想在里面塞一些不一样的东西进去的华。 编译器将会报出一个错误。当然,你可以强制的使用 ...
阅读全文
摘要:额...事实上这节我不大想写,因为比较简单,事实上所有开发者都能看懂,而就算是其他领域的人也能很容易的理解。 当然,操作符重载啥的还是灰藏值得研究的。 列几个书上的例子吧 我们可以重载的操作符有 !$%&*+-./<=>?@^|~ 给两个个例子:[代码]
阅读全文
摘要:F#提供了另外一个给我们去定义函数的方式,这就是使用关键字 fun 在接下来我们会给出例子。一般来说,在有些没有必要去定义一个局部使用,或者是不需要 名字的函数的时候你会用到这个特性。 比如当你的函数可能是会以参数的形式传递给另外一个函数,又或者该函数的作用小到不足以 费周折去定义它的时候。事实上,比如在使用List的时候我们就经常会用到它。 而事实上匿名函数也被称为lambda表达式(...
阅读全文
摘要:递归表示定义的这个函数能够调用他自身。换句话说,这个函数 能在定义自己的时候再调用自己。 在函数式编程中经常会使用递归来代替循环。 大多数人认为,递归能够是你的代码跟容易让别人理解。 在F#中使用递归,我们只需要在定义的时候,在函数名前加上关键字 rec 即可,下面的例子就递归的用法(译者:虽然用递归这样来处理 斐波拉契数并不一定是个合适的选择) [代码] 结果: (fib 2) ...
阅读全文
摘要:事实上,从这一节开始才真正讲到了F#的语法,以及一些build_in的函数之类的, 之前已经写了函数、值与标识符的定义,以及他跟我们适应的一些其他语言的区别。 这里就从作用域开始讲吧。 其实关于作用域,只需要了解一点就可以了,那就是在F#中,一切的作用域都只跟缩进有关, 而对于一个开发人员来说,最好能习惯使用空格来代替Tab,因为在不同的系统中甚至是不同的编辑器中, 对于Tab的定义是不一...
阅读全文