c# – F#中是否有无类型表达式?

在C#中,大多数每个表达式都有一个类型,但有一些例外:

> null关键字
>匿名方法
> lambdas

或许其他我不知道的.这使得类型推断变得不可能,例如这是非法的:

var a = null;

F#是一种语言,其中一切都是表达式:F#中的任何表达式都没有类型吗? (我只是在交互式中输入a = null,它返回一个泛型类型”,但我不确定这是否意味着F#null是泛型类型还是无类型.)

最佳答案 在匿名方法/ lambda的类型方面,F#与C#没有相同的限制,因为它以不同的方式处理匿名函数,并使用
Hindley-Milner type inference为它们推断出一般类型.

因此,将Eric Lippert的例子转换为F#(使用fsi获得即时反馈):

> let f = fun i -> i;;

val f : 'a -> 'a

我们得到了f的推断类型’a – >’.

然而,在某些情况下类型推断系统无法在不事先知道类型的情况下处理,这可能提供与C#无类型表达式最接近的类比.例如:

> let f i = i.Value;;

  let f i = i.Value;;
  ----------^^^^^^^

stdin(18,11): error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved.

换句话说,如果我们不知道i的类型,表达式i.Value没有意义,因为编译器无法分辨我们正在使用哪个Value属性,并且没有任何方法可以在类型.

另一方面,如果我们约束i以便编译器确实知道Value属性是什么,那么一切都很好:

> let f (i : 'a option) = i.Value;;

val f : 'a option -> 'a
点赞