6.6.1 F# 中函数调用的类型判断

尽管,在 F# 中能够用尖括号指定类型參数值。与 C# 中的方式同样。但这样的方法非常少使用。

原因是,当编译器无法判断出全部的信息,须要程序猿的帮助时。我们仅在真正须要的地方,加入类型批注。

我们用一个演示样例来演示:

> Option.map (fun dt -> dt.Year)(Some(DateTime.Now));;

error FS0072: Lookup on object ofindeterminate type.

> Option.map (fun (dt:DateTime) ->dt.Year) (Some(DateTime.Now));;

val it : int option = Some(2008)

与 C# 不一样,F# 中參数值的顺序非常重要。因此。第一种情况会失败。

这是由于F# 编译器要遇到第二个參数值时,才知道 dt 值是 DateTime 类型,所以,在处理第一个參数值时,它不知道 Year 属性是否存在。在另外一种情况中。我们纠正了这个问题,加入了类型批注,显式指定 dt 值的类型。假设我们使用管道来写前面的代码段。就不须要类型批注。这是使用管道运算符重要的原因:

> Some(DateTime.Now) |> Option.map(fun dt -> dt.Year);;

val it : int option = Some(2008)

如今代码能执行,是由于包括了 DateTime 值的选项值先出现,因此,在 lambda 函数之前被处理;当处理 lambda 函数时。编译器已经知道 dt 的类型肯定是 DateTime,这样。它就能够找到 year 属性。而不会有问题。

到眼下为止,我们已经看到了 C# 和 F# 有关类型判断的相似之处,但 F# 走得更远;如今,我们就看一下 F# 编译器对写高阶函数的帮助。

最新文章

  1. Android文件存储
  2. Keeping Async Methods Alive
  3. request.getRequestDispatcher()的两个方法forward()/include()!!!
  4. 安装SQL Server Management Studio Express错误码是29506
  5. 1、关于Boolean(2015年05月30日)
  6. 复杂事件处理——Esper入门(示例程序)
  7. jquery append
  8. iOS基础 - 完善键盘处理
  9. setsockopt()用法(参数详细说明)(转)
  10. ==和equals的异同
  11. Linux文件锁定保护命令chattr介绍
  12. oracle中 sql%rowcount 用法
  13. [Python数据挖掘]第5章、挖掘建模(上)
  14. Mac os x 系统的发展史
  15. 2018牛客网暑假ACM多校训练赛(第二场)E tree 动态规划
  16. MySQL主从复制配置遇到的部分问题
  17. 洛谷 P1407 [国家集训队]稳定婚姻 解题报告
  18. PyCharm+Miniconda3安装配置教程
  19. PHP 函数获取文件名
  20. websocket python实现原理

热门文章

  1. 【Luogu】P3355骑士共存问题(最小割)
  2. ubuntu下卸载python2和升级python3.5
  3. oracle 导出表结构信息
  4. [BZOJ2045]双亲数(莫比乌斯反演)
  5. 标准C程序设计七---55
  6. 反汇编角度->C++ const
  7. 写一简单kernel心得
  8. Mac下Android SDK更新不了的解决办法
  9. ScrollView 嵌套WebView 的问题优化
  10. 牛客网 Wannafly挑战赛5 B.可编程拖拉机比赛-ceil()函数+floor()函数