代码之家  ›  专栏  ›  技术社区  ›  ila

F#语言-新手提示[关闭]

f#
  •  18
  • ila  · 技术社区  · 16 年前

    F# 狂热者。

    functional programming theory

    谢谢

    安德莉亚

    7 回复  |  直到 16 年前
        1
  •  31
  •   ljs TheVillageIdiot    16 年前

    我并不是为了让自己堕落,而是在我的博客上写了几篇F#概述文章 here here . 克里斯·史密斯(MS F#团队成员)有一篇文章叫《20分钟后F#》- part 1 part 2 .

    注意:您必须小心,因为与以前的版本相比,F#(版本1.9.6.0)的最新CTP有一些严重的变化,因此一些示例/教程如果不进行修改可能无法工作。

    这里有一些很酷的东西,也许我可以给你一些提示,这些提示很清楚 非常 简短,可能不太好,但希望能给你一些东西玩-

    首先要注意的是,互联网上的大多数示例都假设“轻量级语法”已打开。要实现这一点,请使用以下代码行:-

    #light
    

    这就避免了您必须插入某些为OCaml兼容性而存在的关键字,以及必须以分号结束每一行。注意,使用此语法意味着缩进定义范围。这将在后面的示例中变得清晰,所有这些示例都依赖于打开的轻量级语法。

    如果使用交互模式,则必须使用双分号终止所有语句,例如:-

      > #light;;
      > let f x y = x + y;;
    
      val f : int -> int -> int
    
      > f 1 2;;
      val it : int = 3
    

    使用“let”关键字定义函数。这可能是所有F#中最重要的关键字,您将经常使用它。例如:-

    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#)的基本部分。

    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"
    

    注意:当我们想要匹配某个内容,但返回的表达式不依赖于输入时,我们会使用“u”符号。

    我们可以根据需要使用if、elif和else语句简化模式匹配:-

    let negEvenOdd x = if x < 0 then "neg" elif x % 2 = 0 then "even" else "odd"
    

    F#列表(在下面作为链表实现)可以通过以下方式进行操作:-

    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通过仅返回列表中通过提供的谓词函数的值来过滤列表。还要注意“有趣的x->f'语法-这是f#lambda。

    请注意,在整个过程中,我们没有定义任何类型——F#编译器/解释器“推断”类型,即从使用中得出您想要的结果。例如:-

    let f x = "hi " + x
    

    这里,编译器/解释器将确定x是字符串,因为您正在执行一个要求x是字符串的操作。它还确定返回类型也将是字符串。

    当存在歧义时,编译器会做出假设,例如:-

    let f x y = x + y
    

    let f (x:string) y = x + y
    

    还要注意,我们必须将x:string括在括号中,我们通常必须这样做来分隔函数定义的各个部分。

    F#中两个非常有用且大量使用的运算符是管道前进运算符和函数组合运算符|>及>&燃气轮机;分别地

    let (|>) x f = f x
    

    这使您能够以更清晰的方式书写内容,例如:-

    [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))
    

    也就是说,只有在第一个函数的参数未指定的情况下,才能转发操作。这很有用,因为您可以执行以下操作:-

    let mapFilter = List.map (fun x -> x * x) >> List.filter (fun x -> x % 2 = 0)
    

    let mapFilter = l |> List.map (fun x -> x * x) |> List.filter (fun x -> x % 2 = 0)
    

    一些很酷的东西:-

    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")
    

    简要概述,希望对您有所帮助!!

        2
  •  6
  •   vextasy    16 年前

    我发现它教会了我很多有用的技巧来编写功能更强大的C#以及提供开始编写Windows托管的F#应用程序所需的所有参考资料。

    http://www.expert-fsharp.com/default.aspx

        3
  •  5
  •   ila    16 年前

    现在,让我开始编码:-)

    let thanksalot = "thanks a lot"
    printfn "%s" (thanksalot);;
    
        4
  •  3
  •   fritzone    16 年前

    Real World Functional Programming

    托马斯·佩特里切克(Tomas Petricek)在《F#》和《C#by》中举例说明

    到目前为止,我发现它非常擅长通过展示C语言的实现来教授F#概念。非常适合面向对象程序员。

        5
  •  2
  •   J D    16 年前

    我的《F#for Scientists》一书的第一章是免费提供的 here . 我们有一系列免费的玩具计划 here . 我们的F#NET杂志的第一篇文章是免费提供的 here

        6
  •  1
  •   Alexandru Nedelcu    16 年前
        7
  •  1
  •   Michiel Borkent    16 年前

    如果您在VisualStudio中有当前的CTP版本,它允许您创建一个F#Tutorial项目,该项目将为您提供一个Tutorial.fs,确切地包含它的名称。

    该教程还指出了一个更大的 F# examples at Microsoft

    CodePlex .

    希望这有帮助,

    米希尔