【发布时间】:2013-10-07 17:06:21
【问题描述】:
给定以下表达式来对数字的 IEnumerable 求和:
let sum l = l |> Seq.reduce(+) //version a
是否可以像这样消除争论?
let sum = Seq.reduce(+) //version b
我从 F# 编译器 (FS0030) 收到一个错误,我似乎记得曾经看到过一些关于“eta 转换”的内容,但不幸的是,我对 lambda calc 的了解太有限,无法理解 eta 转换是如何涉及的。
可以像版本b一样消除参数吗?
请有人向我指出可以解释 eta 转换以及它如何在这段特定代码中发挥作用的文献吗?
FS0030:
stdin(1,5):错误 FS0030:值限制。值“总和”已 推断具有泛型类型 val sum : ('_a -> int) when '_a :> seq 将参数明确地传递给 'sum' 或者,如果您不打算这样做 泛型,添加类型注释。
【问题讨论】:
-
l在版本 a 中做了什么?您能否提醒我们(在问题正文中)FS0030是什么? -
您的意思是
let sum l = Seq.reduce (+) l用于版本 a 吗? -
好吧,正如您从错误中看到的(并且可能知道),F# 不允许泛型值。 F# 仅有限支持无点样式。
-
@petebu 谢谢——代码已修复。
标签: f# lambda-calculus pointfree