假设我有一个功能
let makeMonitoredFun f =
let c = ref 0
(fun x -> c := !c+1; printf "Called %d times.\n" !c; f x);;
为什么我不被允许这样做。
let mrev = makeMonitoredFun List.rev
答案 0 :(得分:5)
因此,您可能是指在尝试编译代码时获得的值类型限制。如果添加类型注释,它将正常工作/。有关值类型错误的详细信息,请参阅本文的http://blogs.msdn.com/b/mulambda/archive/2010/05/01/value-restriction-in-f.aspx来自其中一个F#开发人员
答案 1 :(得分:1)
我能够运行以下代码,因为编译器可以推断出listRevCounter
的类型。
let makeMonitoredFun f =
let c = ref 0
(fun x -> c := !c+1; printf "Called %d times.\n" !c; f x)
let listRevCounter = makeMonitoredFun List.rev
let revList = listRevCounter [ 1; 2; 3 ]