F#第三课 : .net库与F#

今天继续学习F#,主要的内容是关于.net库在F#中的引用。

首先我们引入一些常用的.net名称空间到F#环境
open System
open System.Net
open System.IO
open System.Text
open System.Xml
open System.Windows
open System.Windows.Forms

 

第一个例子,先展示一下F#强大的兼容性,获取一个网址的HTML代码
let webSite = "http://www.google.com/"

let getHtmlByUrl(url: string) = // 注意这里,由于我们在使用HttpWebRequest.Create 方法时,该方法有两个重载函数,所以我们需要显式的去指定参数的类型
    let request  = HttpWebRequest.Create(url)
    let response = request.GetResponse()
    let reader = response.GetResponseStream()
    let strReader = new StreamReader(reader)
    let resHtml = strReader.ReadToEnd()
    resHtml

运行这段代码我们会得到如下输出:

> getHtmlByUrl(webSite);;
val it : string =
  "<!doctype html><html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"><title>Google</title><script>window.google={kEI:"qbwKS_jQAoqI6gP9ovTZDw",kEXPI:"17259,22107,22914,22918",kCSI:{e:"17259,22107,22914,22918",ei:"qbwKS_jQAoqI6gP9ovTZDw"},kHL:"en",time:function(){return(new Date).getTime()}

这个代码太长就不粘出来了。这里主要说的是这个例子使用了.net的Web类来获取指定url的源代码,我们可以看到F#在使用.net库的时候也是很方便的,你只需要使用open关键字来打开需要的.net包即可。这个关键字跟C#中的using和Java中的Import比较类似。在这个例子中,我们还使用了如StreamReader这样的类来帮助我们获取代码内容。

 

下面这个例子我们尝试将上面取得的源代码字符输出到一个winform的窗口上
let mainForm = new Form()
let textBox1 = new TextBox()
textBox1.Dock <- DockStyle.Fill
textBox1.Multiline <- true
textBox1.Text  <- getHtmlByUrl(webSite)
mainForm.Controls.Add(textBox1)
mainForm.ShowDialog()

输出:


在这个例子中,我们创建了一个winform对象,又创建了一个TextBox对象并设置了一些属性,最后将取得的Html源代码显示到这个文本框中。基本上操作跟C#的代码一样,唯一需要注意的是F#的赋值操作符是<-,而不是我们常见的=号。这种赋值方式在数学界是很普遍的,所以在编程语言之初,数学家对在程序中使用=来进行赋值充满了异议。
从上面的两个例子我们可以看到,F#在对.net库的兼容性还是非常好的,这样也提高了不少该语言的实用价值。

 

最后一个例子我们回到大家经常使用的XML文档开发中来,我们看一下在F#中我们如何进行XML的开发
let xml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>
<root>
  <child>1</child>
  <child>2</child>
  <child>
    <subChild>3</subChild>
  </child>
</root>"

let doc = new XmlDocument()
doc.LoadXml(xml)

我们逐个遍历Xml节点,并将节点的内容放入一个list中。
let items =
    [
        for node in doc.SelectNodes("root/child") do
        let link = if node.FirstChild.NodeType = XmlNodeType.Text  then node.InnerXml  else node.FirstChild.InnerText
        yield(link)
    ]
怎么样,代码相当简洁吧!

 

发两句牢骚:

VS2010 Beta2 IDE对native C/C++的支持还是不怎么样。居然连Memory的窗口都没集成进来。而且还不能将目标程序放到工程以为的目录下进行调试。看来还是得等等咯。

 

posted @ 2009-11-24 00:58  moonz-wu  阅读(533)  评论(0编辑  收藏  举报