2012-03-20 26 views
1

可以说我有一个功能一流的功能

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 

回答

5

所以大概你是指当你尝试编译代码时你得到的值类型限制。如果你添加一个类型注释,它可以正常工作。有关值类型错误的详细信息,请参阅本文来自F#开发人员之一的http://blogs.msdn.com/b/mulambda/archive/2010/05/01/value-restriction-in-f.aspx

+0

打我约1秒... +1 – Carsten 2012-03-20 05:28:07

+0

所以这与句法值有关吗?纠正我,如果我错了,但由于makeMonitoredFun List.rev不是一个语法值,那么我们可以用有趣的x - >(makeMonitoredFun List.rev)x来代替它,它应该工作。 – user1072706 2012-03-20 06:00:06

+1

@ user1072706我想你需要做'让mrev x = makeMonitoredFun List.rev x' - 但是检查 – 2012-03-20 11:02:08

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 ] 
+1

,但现在你已经将listRevCounter约束为'int list - > int list' ....这与具有完全合法声明的泛型函数不同。 - 由于编译器(和John发布的文章)告诉你,你可以很容易地解决这个问题,但问题是“你为什么必须修复它” – Carsten 2012-03-20 05:35:54