价值限制:类型' bar'已被推断为具有泛型类型

时间:2016-09-08 14:58:57

标签: f#

在下面的代码段中,我无法理解为什么必须按照fg函数的方式构建foo以及为什么它不能像函数bar那样工作试着去做。

let f a b = a,b
let g (a : 'a) (b : 'a) = a

let (>!) f1 f2 =
    fun a b ->
        let (x,y) = f1 a b
        f2 x y

let foo = fun a b -> (f >! g) a b
let bar = f >! g

任何人都可以向我解释为什么bar无效?鉴于foo也具有泛型类型,对我来说没有任何意义。

1 个答案:

答案 0 :(得分:7)

foo是一个函数,而bar是一个值。是的,它是函数类型的值,但仍然是值。那里有一个微妙的区别。

F#编译器可以“看到”foo是一个函数,因为它会在fun ->之后看到let

另一方面,bar是一个真值 - 通过调用不同的函数(运算符>!)获得的结果。 F#有一条规则(称为“值限制”)说(在日常术语中)值(与函数不同)不能具有泛型类型,除非明确指定泛型参数,因此有效地使其成为“类型函数”。 (它比这更复杂,请阅读下面的链接以获取完整的图片)

这不是特定于F#,但是其他非纯粹的ML变体也有这个。 Here是对F#的此规则的讨论,here's是对SML的讨论。