Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 一级函数_F# - Fatal编程技术网

F# 一级函数

F# 一级函数,f#,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 因此,您可能是指在尝试编译代码时得到的值类型限制。如果添加类型注释,它将正常工作。有关值类型错误的详细信息,请参阅一位F#developer的这篇

假设我有一个函数

 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#developer的这篇文章

,因此您可能指的是在尝试编译代码时得到的值类型限制。如果添加类型注释,它将正常工作。有关值类型错误的详细信息,请参阅本文中的一位F#开发人员

我能够运行以下代码,因为编译器可以推断出
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
的类型

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这与语法值有关吗?如果我错了,请纠正我的错误,因为makeMonitoredFun List.rev不是一个语法值,那么我们可以用类似于fun x->(makeMonitoredFun List.rev)的内容替换它它应该可以工作。@user1072706我想你需要做
让mrev x=makeMonitoredFun List.rev x
-但是check@JohnPalmer我检查了两个表达式,它们在逻辑上是正确的。我前面提到的方法使用了一种称为eta扩展的技术。当然,你的直觉要直观得多。比我快一秒钟+1这与语法值有关吗?如果我错了,请纠正我的错误,因为makeMonitoredFun List.rev不是一个语法值,那么我们可以用类似于fun x->(makeMonitoredFun List.rev)的内容替换它它应该可以工作。@user1072706我想你需要做
让mrev x=makeMonitoredFun List.rev x
-但是check@JohnPalmer我检查了两个表达式,它们在逻辑上是正确的。我前面提到的方法使用了一种称为eta扩展的技术。当然,您的更直观。但现在您已将listRevCounter的类型限制为
int list->int list
。。。。这不同于拥有一个完全合法的声明泛型函数正如编译器(以及John发布的文章)告诉您的,您可以轻松地修复此问题,但问题是“为什么您必须自己修复它”,但现在您已将listRevCounter限制为
int list->int list
类型。。。。这不同于拥有一个完全合法的声明泛型函数正如编译器(以及John发布的文章)告诉你的,你可以很容易地修复这个问题,但问题是“为什么你必须自己修复它”