2011-04-04 26 views
1

后无耻地从托马斯Petricek的博客顺手牵羊的代码片段: http://tomasp.net/blog/csharp-fsharp-async-intro.aspx 具体来说,这一个(和进行了一些改建的话):F# - 类型预计有型异步<'a>但字符串 - > Asnyc <'a>代替

 let downloadPage(url:string) (postData:string) = async { 
    let request = HttpWebRequest.Create(url) 
// Asynchronously get response and dispose it when we're done 
    use! response = request.AsyncGetResponse() 
    use stream = response.GetResponseStream() 
    let temp = new MemoryStream() 
    let buffer = Array.zeroCreate 4096 

    // Loop that downloads page into a buffer (could use 'while' 
    // but recursion is more typical for functional language) 
    let rec download() = async { 
    let! count = stream.AsyncRead(buffer, 0, buffer.Length) 
    do! temp.AsyncWrite(buffer, 0, count) 
    if count > 0 then return! download() } 

    // Start the download asynchronously and handle results 
    do! download() 
    temp.Seek(0L, SeekOrigin.Begin) |> ignore 
    let html = (new StreamReader(temp)).ReadToEnd() 
    return html };; 

我试图用它做以下,并得到了在最后一行的错误:

类型预计有型Async<'a>string -> Asnyc<'a>,而不是

我GOOGLE了错误,但找不到任何显示我的特定问题。

let postData = "userid=" + userId + "&password=" + password + "&source=" + sourceId + "&version=" + version 
let url = postUrlBase + "100/LogIn?" + postData 
Async.RunSynchronously (downloadPage(url, postData));; 

而且,我会如何修改代码,以便它下载一个非结束字节流(但有个字节的每个突发之间偶尔的暂停),异步,而不是一个字符串?读取该字节流时,我将如何进行整合?我意识到这不仅仅是一个问题,但由于它们都是密切相关的,我认为一个问题会节省一些时间。

由于提前,

鲍勃

附:由于我还是F#的新手,请随时对我的代码进行任何修改/建议,以显示它如何以更实用的方式完成。我真的想摆脱我的C#心态,所以我很欣赏任何人都希望分享的指针。

编辑:我不小心粘贴了我正在使用的错误代码段。我确实改变了Tomas的片段并忘记了它。

回答

3

当我尝试运行您的代码时downloadPage(url, postData)不起作用downloadPage需要两个独立的字符串。 downloadPage url postData是预期的。

如果您将let绑定到元组窗体或let downloadPage(url:string, postData:string),您的调用也可以正常工作。

要解释为什么你得到了错误,你会得到更复杂的。咖喱形式创建一个函数,返回一个函数或string -> string -> Async<string>你的情况。编译器因此看到你传递了一个参数(元组毕竟是单个项目),并且看到结果必须是与Async<string>不兼容的string -> Async<string>。它可能发现的另一个错误(在我的情况中)是string * stringstring不兼容。确切的错误是Expected string but found 'a * 'b

+0

我不小心粘贴了我正在使用的错误代码段。我确实改变了Tomas的片段并忘记了它。既然你是唯一一个给它一个镜头的人,可以随意改变你的答案,像我在下面发布的东西,我会给你。如果这个问题没有得到回答,那么回答我自己的问题就会有些阴暗。 :) – Beaker 2011-04-04 16:02:22

+0

@Beaker:你走了,也解释了这种差异,包括我在首次提交时收到并引用的不同错误背后的逻辑。 – Guvante 2011-04-04 16:25:53

+0

谢谢,并为最初的错误感到抱歉。 – Beaker 2011-04-04 20:09:38

0

这是我有什么:

Async.RunSynchronously (downloadPage(url, postData));; 

这是什么工作后继续随机猜测:

Async.RunSynchronously (downloadPage url postData);; 

虽然,我不知道为什么这种变化解决了这一问题。思考?

相关问题