【发布时间】:2016-02-11 20:14:38
【问题描述】:
我不了解嵌套函数的 F# 类型推理系统。当我使用 int、string、...等简单类型之外的类型时,它似乎特别糟糕。
这里是一些打印一些反射信息的代码的小例子
let inferenceTest () =
let t = int.GetType()
let methods = t.GetMethods() |> Seq.map(fun m -> m.Name)
printfn "%s" <| String.concat ", " methods
这很好用!不需要铸造等。现在假设打印涉及更多,因此我们想将它分成一个嵌套函数
let inferenceTestFailsToCompile () =
let printType t =
let methods = t.GetMethods() |> Seq.map(fun m -> m.Name)
printfn "%s" <| String.concat ", " methods
let t = int.GetType()
printType t
这失败了,“根据该程序点之前的信息查找不确定类型的对象。可能需要类型注释...”
为什么类型系统的信息突然变少了?如果我的printType() 函数与我的inferenceTestFailsToCompile() 处于同一范围内,也许我可以理解这个问题
当我创建一个以 t 作为闭包的 lambda 时,打字问题就消失了
let inferenceTestLambda () =
let t = int.GetType()
let printType =
let methods = t.GetMethods() |> Seq.map(fun m -> m.Name)
printfn "%s" <| String.concat ", " methods
printType
【问题讨论】:
-
附带说明:
printType不需要额外的unit参数。它有一个“真实”的论点,足以证明它是一个函数。
标签: types f# type-inference