zoukankan      html  css  js  c++  java
  • 6.6.1 F# 中函数调用的类型判断

    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# 编译器对写高阶函数的帮助。

  • 相关阅读:
    Python
    Java 内部类
    Django with uWSGI and nginx
    Android 使用AsyncTask 下载图片的例子,学会使用AsyncTask
    django QuerySet里那些常用又不常见的技巧
    android模拟器网络设置(局域网)
    iOS9 class dump header
    Qt之QHeaderView自定义排序(终极版)
    Qt之QHeaderView自定义排序(QSortFilterProxyModel)
    Qt之QHeaderView排序
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6839430.html
Copyright © 2011-2022 走看看