2011-03-31 47 views
1

我试图从Beginning F#书中测试一些F#代码,但是在引用'Seq.generate'时出现'not defined'错误。 (我使用VS2010--所以这可能与VS/F#的早期版本一起使用)Seq.generate未定义 - 是否弃用?

FWIW我也安装了F#Powerpack DLL,但这似乎没有什么区别。

在这里有解决方法/替代方法吗?

/// execute a command using the Seq.generate 
let execCommand (connName: string) (cmdString: string) = 
    Seq.generate 
     // This function gets called to open a connection and create a reader 
     (fun() -> openConnectionReader connName cmdString) 
     // This function gets called to read a single item in 
     // the enumerable for a reader/connection pair 
     (fun reader -> readOneRow(reader)) 
     (fun reader -> reader.Dispose()) 
+0

良好的格式是你的朋友 – 2011-03-31 20:23:55

+0

作为一个侧面说明,你可以降低线路(乐趣的读者 - > readOneRow(阅读器))来只readOneRow – Alex 2011-04-01 19:40:28

回答

0

产生可以FSharp.PowerPack.Compatibility发现:Compat.Seq.fs

+0

FWIW我添加了一个裁判,在我的代码,并已加载模块(#r #r“FSharp.PowerPack.Compatability.dll”),但仍然无法获得对Seq.generate方法/ fn的有效引用 - 我是否缺少明显的东西? – BrendanC 2011-03-31 21:31:35

4

你绝对可以使用Seq.generate从F#PowerPack中(无论是通过从源复制它引用它,或者更容易只)。我认为该功能已被删除,因为您现在可以使用use关键字处理对象的处理。

写这个使用readOneRow功能将需要使用可变的状态,但你也许可以用这样的重写:

/// execute a command using the Seq.generate 
let execCommand (connName: string) (cmdString: string) = 
    seq { use reader = openConnectionReader connName cmdString 
     while reader.ReadNext() do 
      // Read some information from the reader (as done in 'readOneRow') 
      let a = reader.GetInt32(0) // (e.g. ..or something like that) 
      yield a // generate next element of the sequence 
     } 

use关键字妥善处置读者的,所以这是为你自动完成。 Seq.generate功能相当不错,但我认为明确写出相同的东西在大多数情况下可能更易读。 (尤其是如果你没有在其他地方使用readOneRow)。

+0

在FSharp.Core中不是'Seq.unfold'吗? – ildjarn 2011-04-01 07:16:37

+0

@ildjarn:哎呀,它应该是'Seq.generate' - 感谢您的更正! ('Seq.unfold'是一个不同的函数,也可以使用,但不太适合) – 2011-04-01 10:12:17