我正在学习 RX(响应式(Reactive)扩展),并且发现有人在将近一年前使用 F# 和 RX 发布了一些代码来制作一个简单的 webCrawler。我试着看看我是否可以重用代码。我下载 RX,并创建一个 F# windows 应用程序,添加对 System.Reactive 的引用。我的IDE是VS 2010 Ultimate,RX版本是:1.1.11111。以下是代码:

#light
open System
open System.Linq
open System.Collections.Generic
open System.Net
open System.IO
open System.Threading
open System.Text.RegularExpressions
open System.Reactive
open System.Reactive.Linq

let create f =
    Observable.Create<_>(fun x ->
        f x
        new System.Action((fun () -> ())))

let ofAsync async =
    create (fun obs -> Async.StartWithContinuations(async, obs.OnNext,obs.OnError,obs.OnError))

let fromEvent (event:IEvent<_,_>) = create (fun x -> event.Add x.OnNext)

let tickEvent = new Event<unit> ()
let tickEventObs = tickEvent.Publish |> fromEvent

let fetch(url:string) =
    async { let req = WebRequest.Create(url)
            let! resp = req.AsyncGetResponse()
            let stream = resp.GetResponseStream()
            let reader = new StreamReader(stream)
            let! html = reader.AsyncReadToEnd()
            return html
          } |> ofAsync

但是代码无法编译,我收到错误消息:
错误 1 ​​未定义字段、构造函数或成员 'AsyncReadToEnd'
所以错误在这一行:
let! html = reader.AsyncReadToEnd()

我想在过去的一年里 RX 或 F# 可能会有一些变化。
对于我目前的环境,重写上面代码的正确方法是什么?
谢谢大家,新年快乐!
约翰

最佳答案

AsyncReadToEnd()StreamReader 扩展方法现在是 FSharpPowerPack 的一部分。从 this 链接安装 FSharpPowerPack,如果还没有,则将 FSharp.PowerPack 的引用添加到您的项目中。这应该使 AsyncReadToEnd() 方法可以从您的其余代码中访问。

关于f# - 字段、构造函数或成员 'AsyncReadToEnd' 未定义错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8695493/

10-13 03:14