`use`关键字不适用于咖喱形式?

时间:2014-12-08 19:00:06

标签: f#

let make f =
  printfn "1"
  use file = File.CreateText("abc.txt")
  let v = f file
  printfn "2"
  v

let f (x: StreamWriter) (y:int) = 
  printfn "3"
  x.WriteLine("{0}", y)

let a = make f

> 1
> 2
> val a : (int -> unit)

a 8

System.ObjectDisposedException: The object was used after being disposed.

编译时不会给我任何错误或警告,但在运行时它会触发这样的错误。

我是否必须使用完整版let make f y = ...来避免咖喱形式?

1 个答案:

答案 0 :(得分:6)

use关键字确保在词法范围结束时调用Dispose方法。这意味着它会在您从make函数返回值时调用它。问题是,在您的情况下,返回的值是稍后调用的函数

换句话说,你所写的内容也可以被视为:

let make f =
  printfn "1"
  use file = File.CreateText("abc.txt")
  printfn "2"
  (fun y -> f file y)

在这里,您可以看到为什么这不起作用。如果要在处理文件之前使用所有参数调用函数f,则需要编写如下内容:

let make f y =
  printfn "1"
  use file = File.CreateText("abc.txt")
  let v = f file y
  printfn "2"
  v