逆向列表中的F#值限制问题

逆向列表中的F#值限制问题,f#,F#,由于值限制问题,以下F#代码未编译: let x = List.rev [] 但这包括: let x = List.rev [] in 3::x 据我所知,编译器推断x必须是int list类型,因此它不会编译 以下内容无法编译: let x = List.rev [] in (3::x, true::x) 但这确实: let x = ([]) in (3::x, true::x) 为什么?据我所知*,有两种方法可以在F#中声明值: 值具有具体类型(例如,列表)。必须显式指定此具体类型

由于值限制问题,以下F#代码未编译:

let x = List.rev []
但这包括:

let x = List.rev [] in 3::x
据我所知,编译器推断
x
必须是
int list
类型,因此它不会编译

以下内容无法编译:

let x = List.rev [] in (3::x, true::x)
但这确实:

let x = ([]) in (3::x, true::x)

为什么?

据我所知*,有两种方法可以在F#中声明值:

  • 值具有具体类型(例如,
    列表
    )。必须显式指定此具体类型,否则编译器必须能够推断它

  • Value有一个泛型类型(例如,据我所知,
    List),在F#中声明值有两种方法:

    • 值具有具体类型(例如,
      列表
      )。您必须明确指定此具体类型,或者编译器必须能够推断它

    • 值具有泛型类型(例如,
      List您可以阅读不同文章中的值限制,例如,或类型推断可以在任何方向传播。对于
      List.rev:'a List->'a List
      ,没有类型的
      'a
      可以同时满足
      int
      bool
      。您可以阅读不同文章中的值限制,例如,或类型i)n差异可以在任何方向上传播。对于
      List.rev:'a List->'a List
      ,没有一种
      'a
      类型可以同时满足
      int
      bool
      // not allowed because x is generic, but not simple
      let x = List.rev []
      
      // allowed because the compiler can infer x's concrete type (List<int>)
      let x = List.rev [] in 3::x
      
      // not allowed because x is generic, but not simple
      let x = List.rev [] in (3::x, true::x)
      
      // allowed because x is both generic and simple (compiler can tell it's the empty list)
      let x = ([]) in (3::x, true::x)