可以说我有一个功能一流的功能
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
可以说我有一个功能一流的功能
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
所以大概你是指当你尝试编译代码时你得到的值类型限制。如果你添加一个类型注释,它可以正常工作。有关值类型错误的详细信息,请参阅本文来自F#开发人员之一的http://blogs.msdn.com/b/mulambda/archive/2010/05/01/value-restriction-in-f.aspx
我能够运行以下代码,因为编译器可以推断出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 ]
,但现在你已经将listRevCounter约束为'int list - > int list' ....这与具有完全合法声明的泛型函数不同。 - 由于编译器(和John发布的文章)告诉你,你可以很容易地解决这个问题,但问题是“你为什么必须修复它” – Carsten 2012-03-20 05:35:54
打我约1秒... +1 – Carsten 2012-03-20 05:28:07
所以这与句法值有关吗?纠正我,如果我错了,但由于makeMonitoredFun List.rev不是一个语法值,那么我们可以用有趣的x - >(makeMonitoredFun List.rev)x来代替它,它应该工作。 – user1072706 2012-03-20 06:00:06
@ user1072706我想你需要做'让mrev x = makeMonitoredFun List.rev x' - 但是检查 – 2012-03-20 11:02:08