F#语言-新手提示
看起来在StackOveflow中,这里有一组Fenthusiasts。
我想更好地了解这种语言,因此,除了函数式编程理论之外,我们能指出我开始使用Flanguage的更好的起点吗?我的意思是,教程,使用方法,但首先要有一个工作样本,以便有机会开始做某事并喜欢这种语言。
非常感谢
安德里亚
解决方案
回答
查看FDeveloper中心。还有hubFS,一个专门讨论F#的论坛。
回答
毫无疑问,我们应该购买Don Syme的出色著作" Expert F#"。这本书写得很好,既适合初学者,也适合专家。在其中,我们会发现入门资料和更具挑战性的资料。这本近600页的书非常物有所值。
我发现它教给我很多有用的技术,以编写更多功能的Cas以及提供开始编写Windows托管Fapplications所需的所有参考资料。
这本书是由Apress出版的,并在以下网址提供附带的网站:
http://www.expert-fsharp.com/default.aspx
回答
并不是要让自己who逼人,而是我在这里和这里的博客上写了几篇Foverview帖子。克里斯·史密斯(MS的团队成员)撰写了一篇名为" Fin 20 minutes"的文章的第1部分和第2部分。
请注意,由于最新的F(1.9.6.0版)CTP与以前的版本相比有一些重大突破,因此我们必须小心,因此,如果不进行修改,其中的某些示例/教程可能无法正常工作。
这里是一些很酷的东西的简要介绍,也许我可以在这里给我们一些提示,这些提示很简短,可能不太好,但希望能给我们带来一些帮助!-
首先要注意的是,Internet上的大多数示例都假定"轻量级语法"已打开。为此,请使用以下代码行:
#light
这样可以避免我们必须插入某些与OCaml兼容的关键字,也不必用分号结尾每行。注意,使用这种语法意味着缩进定义了作用域。这在后面的示例中将变得很清楚,所有示例都依赖于打开的轻量级语法。
如果使用交互模式,则必须使用双分号终止所有语句,例如:
> #light;; > let f x y = x + y;; val f : int -> int -> int > f 1 2;; val it : int = 3
请注意,交互模式在每行之后返回一个" val"结果。这提供了有关我们正在进行的定义的重要信息,例如'val f:int-> int-> int'表示接受两个int的函数将返回一个int。
请注意,只有在交互式方式中,我们才需要使用分号终止行,而在实际定义Fcode时,我们就没有了:-)
我们可以使用'let'关键字定义函数。这可能是所有Fand中最重要的关键字,我们会经常使用它。例如:-
let sumStuff x y = x + y let sumStuffTuple (x, y) = x + y
我们可以这样调用这些函数:
sumStuff 1 2 3 sumStuffTuple (1, 2) 3
请注意,有两种不同的函数定义方式,我们既可以用空格分隔参数,也可以在'元组'中指定参数(即括号中的值用逗号分隔)。区别在于,我们可以使用"部分函数应用程序"来获得使用第一种方法(而不是第二种方法)使用的参数少于所需参数的函数。例如。:-
let sumStuff1 = sumStuff 1 sumStuff 2 3
注意,我们从表达式" sumStuff 1"获得一个函数。当我们可以像具有"一流功能"的语言那样轻松地传递数据时,这就是任何功能语言(例如F#)的基本组成部分。
模式匹配非常酷,基本上就像是类固醇的switch语句(是的,我从另一个F#-ist:-切下了那个短语)。我们可以执行以下操作:
let someThing x = match x with | 0 -> "zero" | 1 -> "one" | 2 -> "two" | x when x < 0 -> "negative = " + x.ToString() | _ when x%2 = 0 -> "greater than two but even" | _ -> "greater than two but odd"
请注意,当我们要匹配某项时使用" _"符号,但是我们返回的表达式不取决于输入。
我们可以根据需要使用if,elif和else语句来简化模式匹配:
let negEvenOdd x = if x < 0 then "neg" elif x % 2 = 0 then "even" else "odd"
Flists(在下面实现为链接列表)可以这样操作:
let l1 = [1;2;3] l1.[0] 1 let l2 = [1 .. 10] List.length l2 10 let squares = [for i in 1..10 -> i * i] squares [1; 4; 9; 16; 25; 36; 49; 64; 81; 100] let square x = x * x;; let squares2 = List.map square [1..10] squares2 [1; 4; 9; 16; 25; 36; 49; 64; 81; 100] let evenSquares = List.filter (fun x -> x % 2 = 0) squares evenSqares [4; 16; 36; 64; 100]
注意List.map函数将平方函数从1映射到列表10,即将函数应用于每个元素。 List.filter仅通过返回列表中通过提供的谓词函数的值来"过滤"列表。另请注意,这是Flambda的'fun x-> f'语法。
请注意,在整个过程中,我们还没有定义Fcompiler /解释器``推断''类型的任何类型,即可以根据使用情况确定所需的类型。例如:-
let f x = "hi " + x
在这里,编译器/解释器将确定x为字符串,因为我们正在执行要求x为字符串的操作。它还确定返回类型也将是字符串。
如果有歧义,编译器会进行假设,例如:
let f x y = x + y
这里x和y可以是多种类型,但是编译器默认为int。如果要定义类型,可以使用类型注释:
let f (x:string) y = x + y
还要注意,我们必须将x:string括在括号中,我们经常必须这样做以分隔函数定义的各个部分。
在Fare中,两个非常有用且经常使用的运算符分别是管道前进和功能组合运算符|>和>>。
我们定义|>因此:-
let (|>) x f = f x
请注意,我们可以在F#中定义运算符,这很酷:-)。
这使我们可以更清晰地编写内容,例如:-
[1..10] |> List.map (fun x -> x * x) |> List.filter (fun x -> x % 2 = 0)
将使我们获得前10个偶数平方。这比以下内容更清楚:-
List.filter (fun x -> x % 2 = 0) (List.map (fun x -> x * x) [1..10])
好吧,至少我是这样认为的:-)
运算符定义的函数组成定义如下:-
let (>>) f g x = g(f(x))
IE。我们可以向前传递操作,只有第一个函数的参数保持未指定状态。这很有用,因为我们可以执行以下操作:
let mapFilter = List.map (fun x -> x * x) >> List.filter (fun x -> x % 2 = 0)
这里mapFilter将接受一个列表输入,并返回像以前一样过滤的列表。它是以下内容的缩写:
let mapFilter = l |> List.map (fun x -> x * x) |> List.filter (fun x -> x % 2 = 0)
如果要编写递归函数,则必须通过在let后面放置" rec"来将函数定义为递归。下面的例子。
一些很酷的东西:
阶乘
let rec fact x = if x <= 1 then 1 else x * fact (x-1)
第n个斐波那契数
let rec fib n = if n <= 1 then n else fib (n-1) + fib (n-2)
嘶嘶声
let (/%) x y = x % y = 0 let fb = function | x when x /% 15 -> "FizzBuzz" | x when x /% 3 -> "Fizz" | x when x /% 5 -> "Buzz" | x -> x.ToString() [1..100] |> List.map (fb >> printfn "%s")
无论如何,这是一个非常简短的概述,希望对我们有所帮助!!
回答
@kronoz很好,非常感谢长时间回答,这是一个非常好的起点。我会按照建议,寻找提到的@vecstasy这本书。
现在,让我去编码:-)
let thanksalot = "thanks a lot" printfn "%s" (thanksalot);;
回答
如果我们在Visual Studio中拥有当前的CTP版本,则可以创建一个FTutorial项目,该项目将为我们提供一个Tutorial.fs,确切地包含其名称所暗示的内容。
该教程还指向Microsoft更大的Fexamples集合。
另外,在CodePlex上还有一个Fsamples项目。
希望这可以帮助,
米歇尔
回答
我一直在阅读真实世界的函数式编程
结合Fand Cby中的示例:Tomas Petricek
到目前为止,通过在Con方面展示实现,我发现在教Fconcepts方面非常好。非常适合面向对象程序员。
回答
我的《 Ffor科学家》一书的第一章可在此处免费获得。我们在这里有一系列免费的Ftoy程序。我们的F#.NET Journal的第一篇文章可在此处免费获得。