le modèle mémoire des données内存模型数据
déclencher =provoquer=engager发动
paramètre参数
compatible兼容的
formel正式的
indiquer 表明.指出
inférence 推理开发软件
en outre 此外
détermine [数学]求方程的根;确定,决定
indispensable不可缺少的
modifications physiques 物理变化
le filtrage de motif:?
manipuler.(科学实验或生产中的)操作,使用;配制,调制
composer组成
affirme证明;肯定
fonction récursive可循环函数
récursive可循环的
prépondérante优势
langage fonctionnel 函数语言
fonctionnel 功能的;函数的
une variable globale
une variable statique
Effet de bord (impur) :就是英语里side effect(副作用)的意思,解释为"指容易被人忽略的结果或者使用不当引起的不好的后果"
intégrer--integrant: 归入,融合,积分
affectation赋值,分配
Typé dynamiquement 动态类型
typé statiquement 静态类型
Sans effets de bord (pur)
avec effets de bord (impur)
cohérent紧密的,协调的
dialecte方言,土话
tips:
1,#号是OCaml解释器的提示符
2, ;;是表达式的结束符,类似于句子的句号
3,OCAML里面不能把浮点数与整数想加,因为OCAML是一种强类型语言( 强类型语言 :这表示变量一旦建立就不能改变类型,并且你不可以在两种不同的类型间进行操作(比如将整数与浮点数相加)。)
4,如何进行浮点数的加法呢?
浮点数运算符是加号后面一点 +.
5,float_of_int是一个函数(<fun> ) 它接收一个整形参数返回一个浮点值。
6,int_of_float n 转化浮点数到整数
float_of_int n 转化整数到浮点数
7,整数运算操作符:
+ 加
- 减
* 乘
/ 除
mod 取模
浮点数操作符:
+. 加
-. 减
*. 乘
/. 除
** 幂
8,x *. x
注意*号后面的点。它告诉编译器函数仅接受浮点型的参数(因此它也返回一个浮点)。
如果*号后没有这个点函数将只接受整形参数。
9,f o g : x -> (f o g) (x)= f(g(x))
根据语法x->f(g(x))推导出f与g必须是函数。这里的x是一个虚变量,称为约束变量。
http://www.linuxfans.org/bbs/thread-51435-1-1.html
10,OCaml的注释是用(*和*)括起,如:
(* 这是一个单行的注释. *)
(* 这是一个
* 多行
* 的注释.
*)
这和C的注释(/* ... */)很相似.
11,http://shiningray.cn/docs/ocaml
字符串可以看作一个数组,它的元素是字符型的,例如字符串"Hello, world.\n"
12,
OCaml是一个静态强类型语言
OCaml不会进行任何隐含转换。如果要一个浮点数,必须写作2.0,因为2是一个整数。
OCaml会返回函数中最后一个表达式,所以无需像C那样写return。
unit类型是一种类似于C中void的东西
13,
float_of_int i +. f;;
float_of_int是一个输入了一个int并返回一个float。除此之外还有很多此类函数,名字诸如int_of_float、char_of_int、int_of_char、string_of_int等等,同时功能基本和名字吻合。
由于将int转换为float是一个特别常用的操作,float_of_int函数有一个较短的别名:以上例子可以简单地写为:float i +. f;;
(注意和C不一样,一个类型和一个函数有同样的名称在OCaml中这是完全有效的。)
14,什么是递归函数?一个函数在它的函数体内调用它自身称为递归调用。 这种函数称为递归函数。有时候使用递归函数能较大的方便工作,但要防止进入死循环.
15,BIOS是英文"Basic Input Output System"的缩略语,直译过来后中文名称就是"基本输入输出系统"。它的全称应该是ROM-BIOS,意思是只读存储器基本输入输出系统
16, 箭头语法:
箭头语法现在看起来很奇怪,不过之后当我们接触所谓的“currying”,你就会明白为何要选它。现在我就要给出几个例子。
我的函数repeated输入一个字符串和一个整数并返回一个字符串的类型为:
repeated : string -> int -> string
我们的函数average输入两个浮点数并返回一个浮点数的,类型为:
average : float -> float -> float
OCaml标准的int_of_char类型转换函数:
int_of_char : char -> int
如果一个函数什么也不返回(对C和Java程序员来说应该是void),那么我们写为返回unit类型。例如,下面是OCaml中等同于fputc的是:
output_char : out_channel -> char -> unit
17,多态函数:
这个函数的类型是什么呢?在OCaml中我们使用一个特殊的占位符来表示“任何你能想到的类型”。这是一个单引号跟着一个字母。前面的函数的类型一般会写作:
give_me_a_three : 'a -> int
18,average平均
举例:
# let average a b =
(a +. b) /. 2.0;;
val average : float -> float -> float =
说来奇怪!OCaml能自己计算出该函数输入两个float参数并输出一个float。
它是如何做到的呢?首先它看在哪里用到了a和b,即在表达式(a +. b)中。现在,+.则是一个总是输入两个float参数,所以通过简单的探测,a和b一定都是float类型的。
第二,/.函数返回一个float,同时它也是average的返回值,所以,average必然返回一个float。最后结果就是average会拥有以下类型签名:
average : float -> float -> float
19,什么时候使用;;,什么时候是;,以及模块、嵌套函数和引用。
局部“变量”(实际上是 局部表达式,local expressions)
http://shiningray.cn/docs/ocaml
http://shiningray.cn/docs/ocaml/the-structure-of-ocaml-programs
http://www.ocaml-tutorial.org/ocaml%E6%95%99%E7%A8%8B继续
http://hi.baidu.com/phpasapjsp/blog/item/eaeb4409644551a82eddd41b.html
20,
在 O'Caml 中,一个例程,或者说一个函式(Function)是这个编程语言中所谓的第一等的公民。何谓"第一等(Fisrt Class)的公民"?就是说,在 O'Caml 中,函式可以像一个 int 或者 float 一样被很方便的传递来传递去。这也就是所谓"Functional 编程语言"中,Functional 一词的由来。
O'Caml 又有一个很强的型别系统。有多态(Polymorphic)和型别自动侦测(Type Inference)的功能。
O'Caml 可以在 Linux 和 Windows 还有 Mac OS 9 以及 Mac OS X 上跑,是免费的开放源代码的自由软件。而且,O'Caml 有一个非常令人满意的 Library。
let rec 表示我们要声明一个递归函式,函式的名称为 fact,接受一个引数(Argument)记为 n。
http://www.ibm.com/developerworks/cn/linux/sdk/ocaml/part1/
美国麻省理工学院 的程序设计入门课程的经典教材《计算机程序的结构及其解释》一书
作为第一等公民的函数数据类型
Functional 程序设计的最吸引人注意的地方在于,"函数"现在可以被当作像整数(int)和浮点数(float)一样的数据类型。这就是说,我们可以把函数 func 赋值给一个变量;可以从子程序返回一个函数,就跟返回一个浮点数一样的容易;两个函数可以进行复合运算,就像两个整数可以进行加减乘除运算一样。我们将看到,在 Functional 程序设计里面,"函数"被提升为程序设计语言中的第一等(First Class)的公民,使用"函数"可以像使用整数和浮点数或者是字符串一样的随心所欲;不再象过去,函数只能被调用,没有其它的花样。
http://www.ibm.com/developerworks/cn/linux/sdk/ocaml/part2/
基础知识:
1,OCaml中的基本类型有:
OCaml 类型 范围
int 32位处理器上是31位有符号整数(大约在+/- 10亿之间), 或者在64位处理器上是63位有符号整数
float IEEE 双精度浮点数,等同于C的double
bool 一个布尔型,true或false
char 一个8位字符
string 一个字符串
unit 写作 ()
http://blog.chinaunix.net/u1/58415/showart_1190607.html
2,CAML簡介 2009-04-11 16:23
分类:MOSS技朮
字号: 大大 中中 小小
一、CAML簡介:
全稱:協作應用程序標記語言
用於在WSS中定義在網站和列表中使用的字段和視圖,還用於在網站設置過程中定義WSS數據庫中的表
二、CAML的作用:
1. 使用CAML自定義網站
2. 使用CAML進行呈現
CAML用於WSS中兩種類型的呈現:
A. 定義字段中包含的數據的類型(數據定義元素)
B. 構造瀏覽器中顯示的HTML(HTML呈現元素)
CAML有兩種類型的元素:
A. 用於字段呈現與架構定義的元素
B. 用於頁呈現的元素
3. 使用CAML進行編程
Ø 創建自定義網站定義和配置
Ø 使用網站定義配置
Ø 設置文件
Ø 創建簡單功能
Ø 自定義Delegate控件
Ø 向用戶界面添加操作
Ø 創建事件處理程序功能
Ø 創建自定義列表定義
Ø 自定義Sharepoint網站的徽標
Ø 向網站定義中添加文檔模板、文件類型和編輯應用程序
Ø 創建解決方案
Ø 向列表添加內容類型
Ø 向網站添加內容類型
Ø 部署工作流模板
Ø 向列表添加列
Ø 引用內容類型中的列
Ø 自定義字段類型定義
三、數據定義元素:
CAML字段呈現元素在呈現單個字段時使用,這些字段可顯示在字段類型定義(12\TEMPLATES\XML\FldTypes?.xml)中
每一個字段的定義都由兩個部份組成:
a. 字段定義部份
Name值說明:
Ø AllowBaseTypeRendering:默认值为 FALSE。設置為True表示該字段在顯示時如果出錯就顯示成父類型
Ø TypeName:字段類型名稱
Ø ParentType:父類的名稱
Ø TypeDisplayName:顯示名稱(是指在列表设置页面中显示的名称)
Ø TypeShortDescription:簡短說明(则是在创建栏页面中显示的名称)
Ø Filterable:此字段是否可用於使用此字段的列表中進行篩選
Ø Sortable:是否可以在使用了此字段的列表中對此字段進行排序
Ø ShowOnListAuthoringPages:是否在列表中顯示此字段
Ø ShowOnDocumentLibraryAuthoringPages:是否在文檔庫中顯示此字段
Ø ShowOnSurveyAuthoringPages:是否在調查列表中顯示此字段
Ø ShowOnColumnTemplateAuthoringPages:是否為列模板字段
Ø FieldTypeClass:該字段的程序集名稱
Ø FieldEditorUserControl:指定自定義的字段編輯屬性控件(field_typeFieldEditor.ascx)地址,如果不存在該元素,则字段类型的特定属性将由 PropertySchema 元素(字段类型)元素呈现。
Ø InternalType:表示一个内部基本类型,不要在自定义字段类型定义中使用此元素
Ø SQLType:表示将用于在内容数据库中存储数据的SQL数据类型,不要在自定义字段类型定义中使用此元素
b. 字段呈現部分
Name值說明:
Ø HeaderPattern:定義列標題在列表視圖頁面上的呈現定
Ø DisplayPattern:定義字段在”視圖”(列表項)表單和列表視圖頁面上的呈現模式(DispForm.aspx與AllItems.aspx頁面上的呈現模式)
Ø EditPattern:定義字段在EditFrom.aspx頁面上的呈現模式
Ø NewPattern:定義字段在NewForm.aspx頁面上的呈現模式
Ø 其它三個基本上用不到,這里就不列出來了
可使用的CAML元素:
Ø Column:返回特定字段的原始数据值
Ø Column2:用于呈现链接字段类型
Ø Escape:用于转义字符串中的特定字符
Ø FieldFilterOptions:用于 FldTypes.xml 的 HeaderPattern 部分中,以显示筛选器下拉菜单
Ø FieldRef:用于计算字段以引用构成字段,还用于视图中以定义存在哪些字段
Ø FieldSortImageURL:返回指向用于指示如何对列进行排序的图像文件的 URL
Ø FieldSortParams:返回列表的排序方向,基于是否已排序字段以及当前默认排序方向来呈现 Asc 或 Desc
Ø IfEqual:允许基于两个 CAML 表达式的比较结果进行条件呈现
Ø IfNew:如果项被视为新项,则返回 TRUE
Ø ImagesPath:返回项目的图像目录的 HTTP 路径
Ø Limit:将文本截断为指定大小
Ø LocaleInfo:将服务器区域设置信息传输到客户端,以便正确显示和编辑日期和数字
Ø PageUrl:用于任何位置,以返回当前页的绝对、编码的 URL
Ø Property:从当前 ForEach 上下文返回属性
Ø ScriptQuote:用于从服务器呈现必须解释为引用字符串的文本
Ø TodayISO:以 ISO 格式呈现当前日期和时间
c. 字段屬性設置部分(在未指定FieldEditorUserControl時使用)
四、HTML呈現元素
頁面呈現CAML元素用於呈現頁面,如需要提取特定字段的屬性並將其呈現在面面上時
名称
说明
Batch
用于批处理 HTTP 协议中的命令。
Case
用于在 Switch 或 FieldSwitch 语句内执行比较。
Default
包含将新的项目表单初始化为的字段的默认值。
Expr
包含一个 CAML 表达式,计算该表达式以确定 Switch 或 FieldSwitch 语句的操作过程。
FieldSwitch
基于 CAML 表达式的值提供条件呈现。
ForEach
提供一个用于枚举当前列表中定义的视图或字段的集合的基本机制。
GetVar
在呈现页面的上下文中返回一个变量。
HTMLBase
返回一个为当前页面设置基元素的字符串。
HttpHost
呈现包含当前网站的虚拟服务器的 URL。
HttpPath
返回适当的 OWSSVR.DLL 的路径。
HttpVDir
返回当前网站的根目录。
IfEqual
允许基于两个 CAML 表达式的比较结果进行条件呈现。
ListProperty
从数据库返回指定列的值。
Now
呈现当前时间。
Project
Onet.xml 中的顶级元素。
ProjectProperty
返回当前工作组网站的全局属性。
Property
从当前 ForEach 上下文返回属性。
SetList
指定当前列表。
SetVar
在呈现页面的上下文中设置变量。
Switch
允许基于 CAML 表达式的值的条件呈现。
Today
呈现当前日期。
URL
呈现一个 URL。
View
在 Windows SharePoint Services 中定义视图。
XML
用作外部包装以表示 CAML 的一节。
五、CAML查詢架構
用來定義對列表數據的查詢 參考:http://msdn.microsoft.com/zh-cn/library/ms467521.aspx
六、CAML視圖架構
用來定義列表視圖在WSS中的呈現方式
參考:http://msdn.microsoft.com/zh-cn/library/ms439798.aspx
七、CAML List架構
用來定義創建列表的元數據
參考:http://msdn.microsoft.com/zh-cn/library/aa543477.aspx
八、CAML網站架構
用來定義創建網站集或網站的元數據。
网站定义指定导航栏、列表模板、文档模板、列表基本类型、配置、模块、组件和服务器电子邮件页脚,以创建网站。
參考:http://msdn.microsoft.com/zh-cn/library/aa544502.aspx
九、文檔圖標架構
在DocIcon.xml文件中使用文檔圖標架構可將文件擴展名和ProgID映射到相磁圖標
參考:http://msdn.microsoft.com/zh-cn/library/aa979708.aspx
十、其它架構
Ø 内容类型定义架构
Ø 功能架构
Ø 自定义字段类型定义
Ø Solution 架构
Ø 升级定义架构
Ø 工作流程定义架构
參考:http://msdn.microsoft.com/zh-cn/library/ms460357.aspx
Ocaml其他相关好网站:
http://blog.163.com/szmax_limin/blog/static/58182861200931142325680/
http://blog.csdn.net/RainyLin/archive/2008/06/13/2544126.aspx
http://www.javaeye.com/wiki/topic/31840
http://coderplay.javaeye.com/blog/93110
F#学习之路(1)什么是函数式编程
kimmking 2008-09-13
对于什么是函数式编程,这个是人云亦云。本文并不打算对此进行定义,而是希望与园子里的朋友们共同探讨这个话题,抛砖只为引玉。 本文希望通过介绍F#中的语法,来了解函数式编程中专门的概念。 1、维基百科给出的定义是: 函数式编程是种编程范式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ 演算(lambda calculus)。 而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。 2、函数应该是高阶函数,可柯里化 从维基百科定义可以看出,大家对函数式编程语言中,函数是一等公民(first class)这个概念是没有异议的。 函数应该享受值的同等待遇,可以作为一个函数的参数,可以作为一个函数的返回值。 函数应该是高阶函数。函数应该可柯里化(currying)。 1#light 2 3let p f= 4 fun (x)-> f(x) 5 6let c t= 7 t+10 8 9let r=p c 10 11let f=p (fun x-> "Hello," + x ) 12printfn "r=%d" (r 10 ); 13printfn "f=%s" (f "Lvxuwen") 14open System 15 16 Console.ReadKey(true) 17 18 在F#中定义一个函数使用let 绑定表达式, 语法规则如下: let函数名 参数1 参数2…参数n=函数体 F#参数之间用空格分隔,而不同于C#中用逗号分隔,参数也不用括号。 上面的F#代码第一行用#light指令,指出使用精简的语法规则,而不使用OCaml语法,OCaml语法使用begin end ;; ; in 等关键字来区分语句及作用域,使用#light指令后,虽然让我们可以使用简洁的语法,但这也意味着F#将利用缩进来区分语句及作用域。你可以在vss中 选择工具-选项-文本编辑器->F#-Tabs,设置Tab为插入空格,这可以让你方便的使用tab键缩进。另外,在vss中,你把上例"Hello," 改成中文"欢迎",如果在控制台中乱码,你可以选择 文件->高级保存选项->更改字符编码为中文简体GB2312或unicode编码。 3、纯函数式语言没有变量和副作用 这一点是函数式语言被认为编写并发程序最理想语言的重要原因。没有了变量和副作用,就不再有竞争资源的问题存在,就不再需要锁。 在F#中,let定义的标识符是表达式,并且一旦定义就不可更改。定义变量要使用专门的关键字mutable 1let mutable var=20 2 3var<-30; 4 5let constant=30 6 7constant=40 8 9 10 11printfn "var=%d" var 12 13printfn "constant=%d" constant 14 15 变量var使用mutable关键字定义,并使用<-操作符赋值。而=操作符而被用做相等比较运算符,而constant使用<-,就会编译报错 函数式编程中,函数用来定义规则,算法,如果一个函数使用同一个值传入,总是返回相等的结果,我们就说这个函数是没有副作用, 幂等的。 这样的函数最符合重用的原则,在高阶函数计算过程中可得到预知的结果。 4、函数式编程函数应该是惰性求值的 惰性求值(Lazy value),指的是表达式在需要时计算,而不是在定义时计算。这是支撑函数组合计算必要的条件,函数作为值传递过程中并不计算,只在明确调用时计算。 某些函数式语言,会将一些惰性操作作为普通求值过程的一部分,而F#则需要使用lazy来明确指定,表达式求值是惰性的。 5、函数式编程中大量使用模式匹配 6、函数式编程中经常使用递归来代替循环。 总结:函数式编程语言中函数是一等公民,它使用高阶函数来组合函数,数据从函数中流入流出,函数式程序就是一个个函数的组合,数据被一个个函数处理, 或折分或组合生成新的数据结构。 参考文献: 为什么函数式编程至关重要? 函数式编程另类指南 什么是monad? http://www.cnblogs.com/lvxuwen/
F#学习之路(2) 深刻理解函数(上)
kimmking 2008-09-13
函数在函数式编程语言中是一等公民,是函数式语言中最重要的基本组成元素,也是其名称的由来。 F# 中的函数之如C#中的类,是组织程序结构的最基本单元。是命令式编程语言中函数或OO编程语言中方法的超集。超集,有多强大?我将在下面几个方面细细道来。 F#是一种多范式的编程语言。支持命令式、函数式、面向对象的编程范式,还有目前火热的面向语言编程(DSL)。本文不会介绍其他的编程范式,只介绍函数式编程范式。 在面向对象编程的世界里,视命令式或过程式是一种丑陋的编程方式,至少被大多数程序员视为不能有效发挥OO语言强大功效的编程方法。在函数式编程世界里,同样会认为命令式、OO的编程范式只是辅助的编程方法。过程式的流程控制语句被认为是不适宜的,if else 的条件判断被替代为模范匹配,while,for的循环语句也替代为使用尾递归的递归函数。尽管F#支持其他两种编程范式,但还是应限定在特定的场景下,应主要以函数式编程范式为主,我将在以后专门写一篇blog来探讨F#中各种编程范式相应的适用场合。 本文假设已经使用了#light指令,下面的代码风格都是轻量的。注意#light指令要求你严格的缩进,空格被视为语法的一部分,同一层级的语句之间必须严格的对齐。为了方便的缩进,请设置tab为插入空格代替,我在前文 《F#学习之路 (1)什么是函数式编程》已有介绍设置的方法。 1、如何定义一个普通函数 F#中函数分为递归函数和非递归函数,我把非递归函数称为普通函数。F#中函数默认是不能递归的。 代码一: Code 1 let f0 () =25 2 3 let f1 x =x+1 4 5 let f11 _ =1/0 6 7 let f2 x y=x+y 8 9 let f3 (x:float) (y:float) (z:float):string =sprintf "%f" ( x*y*z) 10 11 let isEven =fun x -> x %2=0 12 13 let fn f x= 14 15 match isEven x with 16 17 true -> f(x) 18 19 false ->() 20 21 let print_even x= fn ( fun x -> printfn "%d is even" x) x 22 23 print_even 20 24 25 上面的代码,你能够全部读懂吗?。 在F#中一切皆是表达式,记得这一点非常重要。这不同于命令式编程范式有语句概念。 什么是表达式,从学习c语言开始,给我灌输的概念是,表达式由运算符、常量、变量组成,表达运算产生结果值。我仍沿用这个概念,不过这个运算符、常量、变量有了新变化 。运算符是函数,大多数运算符允许你重新定义。默认定义的标识符是常量,不可变,变量使用mutable关键字指定。函数是表达式,lambda(可理解为匿名函数)是表达式,就连过程式的if else也是表达式,有运算结果值。需要指出的是在F#中,函数的返回值是由最后一个表达式计算的结果值,并且不能使用return 关键字指定。在循环结构while,for中也不能使用return。break目前版本用做保留关键字,return只能用做工作流中(一种使用monad算子的语法糖,我将在后面简述),while,for 表达式的结果值为(),()为Unit类型的实例,相当于C系列的void。因为没有了return,break,在F#中过程式的代码控制能力是受限的,要编写break,return的语义,你需要借助闭包和递归函数,所以你还是转变一下思维吧。 代码二: Code 1 let unit=print_even 20 2 3 printfn "%A" unit 4 5 let value=if 3/2=1 then true else false; 6 7 printfn "%A" value 8 9 上面这段代码演示了如何接受unit结果值和if else表达式返回的结果值 让我们回到正题。我来解释一下代码一的片段。 let f0 () =25 f0是函数名称,他带有一个参数,参数类型为Unit类型,返回值为整型25 。函数签名或类型为 val f0:unit->int。 F#是一种强类型的语言,是严格的函数式语言,而不是惰性函数语言,尽管他提供了一些有效的方法来支持惰性。是强类型的语言,那为什么没有类型声明了。 F#来自于ML家族,其语法规则主要借鉴OCmal,他使用类型推断技术,根据上下文来推断类型信息。 let f1 x =x+1 函数f1,他带有一个参数x,参数类型为int型,返回值为整型。函数签名为val f1:int->int。F#是如何推断出函数的参数类型和返回值类型的,在F#中 (+)操作符,其操作数1为整数,所以要求x只能是整型,(+)函数的返回值为整数,所以可以推断出f1的类型。 注意的是f0,f1的参数书写,在c#中方法的参数是需要括号的,而在F#的括号是可以省略的,更需要指出的是f0的()不能看成是括号,而是Unit类型的实例。有意思的是在目前的版本中unit 的值(),左括号与右括号之间可以有任意的空格。这不符合人们的认知。因为实例标识应是固定的,这也是造成人们视()为符号括号的主要原因。上面的f1可以写作 let f1 (x) =x+1 ,因为在F#中括号可以省略,所以官方给出的代码大都省略了。 let f11 _ =1/0 这段代码跟f1的定义,有两点需要指出。一个就是参数使用了 下划线 _,这表示参数可以使用任何类型。二是函数体中的1/0,这在c#中无法编译通过的,而在F#中(/)运算符是函数,所以只会在运行时出现除零错。F11的函数签名为val f11:'a->int,'a表示这是一个泛型类型,因为没有约束,所以可以接受任何类型 let f2 x y=x+y F#中多个参数之间使用空格分隔,而不是使用逗号。这个函数签名为val f2:int->int->int,表示有两个int型参数,返回值为int型。 注意这个定义 :let f22 (x,y)=x+y f2与f22有很大的区别,f22表示的是一个参数,其类型为元组(tuple)类型,返回值为int型,在F#中元组类型使用(x,y,z)方式定义。元组表示 一组类型值的集合,可为相同的类型也可为不同的类型,元组是F#的原生类型,也意味着函数的返回值可以返回一个元组类型的值,方便我们返回多值。f22的函数签名为val f22:int*int->int。 let f3 (x:float) (y:float) (z:float):string =sprintf "%f" ( x*y*z) 函数f3有三个参数,都是浮点型,c#的double类型,返回值为string,函数签名为 val:float->float->float->string,f3的函数定义使用显示指定类型,F#的( * )操作符默认同样是操作int型的,所以通过显示指定的方法,强制f#编译器使用float类型参数。函数返回值类型在这个例子中可以不指定,因为sprintf函数返回值是string类型,F#可以推断出f3的返回值是string类型。 let isEven =fun x -> x %2=0 F#支持lambda表达式,lambda表达式可以视为匿名函数。isEven接受一个lambda表达式,他的签名为val isEven:int->bool,从签名中可以看出他等同于let isEven x=x%2=0。 let fn f x= match isEven x with true -> f(x) false ->() 函数式语言通常都有一种语法叫模式匹配(Pattern Match),他比c#中swith语句强大的多,不仅可以匹配基本原生类型,还支持通过自定义活动模式(Active Pattern,据我所知,这种语法只有F#提供了),来扩展。你可以理解为模式匹配为高级多态。 上句表示,如果某个整型数是偶数,那么叫执行一个函数f,否则返回()。函数式的模式匹配可以让我们消除编写if else,swith之类的条件判断语句的需要。 函数fn的签名为val fn:(int->unit)->int->unit let print_even x= fn ( fun x -> printfn "%d is even" x) x print_even 20 上面的代码演示了如何调用函数print_even,如何把lambda表达式作为参数传递 2.如何定义递归函数 递归函数表示一个函数可以调用自身,一般的递归函数会大量的使用堆栈。但尾递归则不会,尾递归会使用迭代来代替递归。 Code 1let breakn n (l:'a[]) = 2 3 let i =ref 0 4 5 let rec iter () = 6 7 if !i>n then () 8 9 else 10 11 printf "%A" l.[!i] 12 13 i :=!i+1 14 15 iter () 16 17 iter () 18 19 20 21breakn 8 [0..10] 22 23 上面的代码演示了有break语义函数。breakn是一个普通函数,它有两个参数,一个是整型n,另一个是l,泛型数组。返回值是unit let i =ref 0 i是一个int ref型的值,它引用了整数0,实际上ref是泛型函数,它返回一个Ref记录类型,它的定义类似下面: Code 1 type Ref<'a>={mutable contents:'a} 2 3 let ref a={contents=a} 4 5 breakn函数体内又定义了一个函数,而且这个函数使用了rec关键字,这说明两点,在F#中函数可以内嵌,第二,递归函数要使用rec关键字来说明 ref类型的操作有一些不同,反引用ref类型值使用感叹符!,而赋值使用:=。 上面的代码编译后,通过Reflector反编译为c#代码,可以看到变成了while循环。
http://fsharp.group.javaeye.com/
http://www.javaeye.com/topic/232900
http://fsharp.group.javaeye.com/group/topic/7128
http://www.pudn.com/
游戏编程 http://www.pudn.com/
就目前看来,F#类似的函数是编程可以应用的范围包括:需要进行算法密集型的数据分析,以及希望进行惰性Lambda计算等等情况。
原来F#是基于OCaml的啊
呜,没第一时间去试试F#。刚才突然兴起,查别的资料的时候正巧看到了F#这名字,顺便点过去看看,发觉F#是基于OCaml的。这真是太好了,以前掌握的OCaml的知识可以快速应用在.NET平台上了。
人工智能AI程序设计语言
作者: 发布时间:2008-01-05
20 年后,我们用什么样的语言?也许现在谁都不好回答,20年前的程序员们会告诉你用汇编吧,今天人们也许会告诉你用c语言(c++?)吧。那么20年后呢,也许不是c语言了吧。下面都是所谓的非主流语言,不过它们的设计思想、所能够完成的功能,绝对不比c语言差。也许将来它们会成为主流,也许不会,可是不管怎样,它们都有自己的闪光之处。
人工智能(Artificial Intelligence)
http://www.chinaai.org/
CAML习题:
http://pagesperso-systeme.lip6.fr/Christian.Queinnec/Teaching/caml/tdcaml.html
搜索 CAML EXERCICES
Livres sur Caml:
http://caml.inria.fr/pub/old_caml_site/books-fra.html
搜索"人工 智能 学习"等等
回复删除好网站:http://mindhacks.cn/2008/09/11/machine-learning-and-ai-resources/
回复删除北大 人工智能课件
回复删除http://hi.baidu.com/muinlive/blog/item/86c0c20366c952743912bbfd.html/cmtid/9d8ab5cb25bf7efa52664fd8
http://www.zxbc.cn/html/20070725/24715.html
回复删除人工智能之鼻祖
以及人工智能历史等等----科学美国人那篇文章