我正在学习 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/