逆向列表中的F#值限制问题
由于值限制问题,以下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#中声明值: 值具有具体类型(例如,列表)。必须显式指定此具体类型
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
。您可以阅读不同文章中的值限制,例如,或类型i)n差异可以在任何方向上传播。对于bool
,没有一种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)
- 值具有具体类型(例如,