b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

F# 20分钟快速上手(二)(2)

电脑杂谈  发布时间:2016-04-19 14:52:29  来源:网络整理

Title枚举可以工作地很好,但一段时间后,如果需要添加一个Ms值,那么每一个switch语句都面临一个潜在的bug。当然您可以尝试修复所有的代码,却难免会发生遗漏。

枚举可以很好地表达某些概念,但是却无法提供足够的编译器检查。f#中的Union类型可设定为一组有限的值:数据标签(data tag)。例如,考虑一个表示微软员工的Union:

typeMicrosoftEmployee=
|BillGates
|SteveBalmer


如果有一个MicrosoftEmployee类型的实例,您就知道它必定是{BillGates,SteveBalmer,Worker,Lead}之一。另外,如果它是Worker,您可以知道有一个字符串与之关联,也许是他的名字。我们可以轻松地创建Union类型,而后使用模式匹配(下一小节)来匹配它们的值。

)])

letprintGreeting(emp:MicrosoftEmployee)=



Lead(name,_)

现在假设需要扩展Union类型:

typeMicrosoftEmployee=
|BillGates
|SteveBalmer

*MicrosoftEmployeelist
|ChrisSmith

我们会看到一些编译器警告信息:

extendUnionWarning

编译器检测到您没有匹配Union的每一个数据标签,发出了警告。像这样的检查会避免很多bug,要了解

更多的关于Union类型的信息,看。

7. 模式匹配(Pattern Matching)

模式匹配看起来像是增强版的switch语句,允许您完成分支型控制流程。除了跟常数值进行比较外,还可以捕获新的值。比如在前面的例子中,我们在匹配Union数据标签时绑定了标识符name。

letprintGreeting(emp:MicrosoftEmployee)=



Lead(name,_)
name

还可以对数据的结构进行匹配,比如对列表(list)进行匹配。(还记得吗,x :: y表示x为列表的一个元素,y是x之后的元素,而[]则是空列表。)

letlistLengthaList=






在这个匹配的最后,我们使用了通配符_(下划线),它匹配任意值。如果aList变量包含多于三个的元素,最后的模式子句将执行,并抛出一个异常。模式匹配还可以我们执行任意表达式来确定模式是否匹配(如果表达式的值为false,则不匹配)。

letisOddx=



我们甚至可以使用动态类型测试进行匹配:

letgetType(x:obj)=





8. 记录类型(Records)

在声明包含若干个公有属性的类型时,记录类型是一种轻量级的方式。它的一个优势是,借助于类型推演系统,编译器可以通过值的声明得出适当的记录类型。

}

;
Zip=20500}

在上面的例子中,首先定义了Address类型,那么在声明它的实例时,无须显式地使用类型注解,编译器可根据字段(属性)的名称自行得出类型的信息。所以whiteHouse的类型为Address。

9. Forward Pipe Operator(|>)

|>操作符只是简单地定义为:

其类型前面信息为:

可以这么来理解:x的类型为'a,函数f接受'a类型的参数,返回类型为'b,操作符的结果就是将x传递给f后所求得的值。

还是来看个例子吧:

//Takeanumber,squareit,thenconvertittoastring,thenreversethatstring

letsquarex=x*x
)=x.ToString()
String(Array.rev(x.ToCharArray()))

//32->1024->"1024"->"4201"

上面的代码是很直白的,但语法看起来却不太好。我们所做的就是将一个运算的结果传给下一个运算。我们可以通过引入几个变量来改写代码为:


letstep2=toStrstep1
letstep3=revstep2
letresult=step3

但是我们需要维护这几个临时变量。|>操作符接受一个值,将其转交给一个函数。这会大大地简化f#代码:


10. 序列(Sequence,System.Collections.Generic.IEnumerator<_>)

序列(在F#中为seq)是 System.Collections.Generic.IEnumerator的别名,但它在f#中有另外的作用。不像列表和数组,序列可包含无穷个值。只有当前的值保存在内存中,一旦序列计算了下个值,当前的值就会被忘记(丢弃)。例如,下面的代码生成了一个包含所有整数的序列。


11. 集合(Collections:Seq,List,Array)

在F#中,如果您想表示一个值的集合,至少有三个好的选择——数组、列表和序列,它们都有各自的优点。而且每种类型都有一系列的模块内置于f#库中。您可以使用VS的智能感知来探究这些方法,这里我们来看看最常用的那些:

iter。iter函数遍历集合的每一项。这与foreach循环是一致的。下面的代码打印列表的每一项:


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shenmilingyu/article-1935-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...