一流的功能

时间:2012-03-20 05:16:12

标签: f#

假设我有一个功能

 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

2 个答案:

答案 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 ]