没有

时间:2017-10-23 18:41:02

标签: f# options flatten

在Option模块上应用flatten功能时出错:

let flatten  =
function
| None          -> None
| Some innerOpt -> innerOpt

这仅适用于以下投影:一些1。 但如果输入为“无”,那么我会收到此错误:

flatten None 

error FS0030: Value restriction. The value 'it' has been inferred to have generic type
    val it : '_a option
Either define 'it' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation.

在无案例中,flatten如何与泛型一起使用?

1 个答案:

答案 0 :(得分:10)

flatten是类型'a option option -> 'a option的通用函数。当参数为it时,编译器无法推断用于自动REPL变量None的类型参数(这是前一个表达式的结果)。您可以指定自己的变量:

let it : int option = flatten None;;

明确指定None的类型:

flatten (None : int option option);;

flatten (Option<int option>.None);;

或明确指定通用参数flatten

flatten<int> None;;

这会生成警告,您可以通过将type参数设置为flatten来删除:

let flatten<'a> (o : 'a option option) =
    match o with
    | None          -> None
    | Some innerOpt -> innerOpt