作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
printfn "f1()" f1在 FSI 中绑定(bind)为 *bind f1*-6ren">
让我们取一个简单的函数值f1
:
let f1 = printfn "*bind f1*"; fun () -> printfn "f1()"
f1
在 FSI 中绑定(bind)为
*bind f1*
val f1 : (unit -> unit)
> () |> f1 |> f1;;
f1()
f1()
val it : unit = ()
f2<'a>
:
let f2<'a> = printfn "*bind f2*"; fun () -> printfn "f2()"
f2
在 FSI 中绑定(bind)为
val f2<'a> : (unit -> unit)
*bind f2*
输出任何内容,但随后被调用,在每个
f2
上输出它调用:
> () |> f2 |> f2;;
*bind f2*
f2()
*bind f2*
f2()
val it : unit = ()
最佳答案
F# 通常不允许创建泛型值,因为这会引入“值限制”困难(也就是说,您不能创建泛型的语法值,即使它是返回函数的代码)。所以,你的 f2
不应该被允许,但是...
该规则有一个异常(exception)——拥有像 List.empty
这样的通用值通常很有用。因此,如果您声明一个带有显式泛型类型参数的值,它实际上会被编译成一个返回结果的函数。
这正是您的示例中发生的情况:
let f2<'a> = printfn "*bind f2*"; fun () -> printfn "f2()"
f2
是一个泛型值(尽管它实际上并没有在任何地方使用类型参数),但它有一个显式的泛型类型参数,因此它实际上被编译成一个每次调用的方法
f2
被访问并返回结果(函数
unit -> unit
)
关于generics - 为什么显式泛型函数值与类似的非泛型绑定(bind)不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19627496/
我是一名优秀的程序员,十分优秀!