zoukankan      html  css  js  c++  java
  • [转]F# Samples 101

    http://code.msdn.microsoft.com/F-Samples-101-0576cb9f/sourcecode?fileId=18956&pathId=1045958806

    // F# 教程文件
    //
    // 此文件包含代码示例来引导您了解
    // F# 语言的基元。
    //
    //http://fsharp.net 网站上了解有关 F# 的更多信息
    // 
    // 有关更大的 F# 示例集合,请参见:
    //     http://go.microsoft.com/fwlink/?LinkID=124614
    //
    // 内容:
    //   - 简单计算
    //   - 针对整数的函数
    //   - 元组
    //   - 布尔值
    //   - 字符串
    //   - 列表
    //   - 数组
    //   - 更多集合
    //   - 函数
    //   - 类型: 联合
    //   - 类型: 记录
    //   - 类型: 类
    //   - 类型: 接口
    //   - 类型: 带有接口实现的类
    //   - 输出
    
    // 打开某些标准命名空间
    open System
    
    // 简单计算
    // ---------------------------------------------------------------
    // 此处是一些简单的计算。请注意可以如何通过“///”注释来
    // 说明代码。将鼠标指针悬停在任何变量引用的上面,
    // 可查看相关文档。
    
    /// 一个非常简单的整数常量
    let int1 = 1
    
    /// 另一个非常简单的整数常量
    let int2 = 2
    
    /// 将两个整数相加
    let int3 = int1 + int2
    
    // 针对整数的函数
    // ---------------------------------------------------------------
    
    /// 一个针对整数的函数
    let f x = 2*x*x - 5*x + 3
    
    /// 简单计算的结果
    let result = f (int3 + 4)
    
    /// 另一个针对整数的函数
    let increment x = x + 1
    
    /// 计算一个整数的阶乘
    let rec factorial n = if n=0 then 1 else n * factorial (n-1)
    
    /// 计算两个整数的最大公因数
    let rec hcf a b =                       // 注意: 两个参数之间由空格分隔
        if a=0 then b
        elif a<b then hcf a (b-a)           // 注意: 两个参数之间由空格分隔
        else hcf (a-b) b
        // 注意: 函数参数通常是由空格分隔的
        // 注意:“let rec”定义一个递归函数
    
          
    // 元组
    // ---------------------------------------------------------------
    
    // 一个包含整数的简单元组
    let pointA = (1, 2, 3)
    
    // 一个包含整数、字符串和双精度浮点数的简单元组
    let dataB = (1, "fred", 3.1415)
    
    /// 一个用于交换两个值在元组中的顺序的函数
    let Swap (a, b) = (b, a)
    
    // 布尔值
    // ---------------------------------------------------------------
    
    /// 一个简单的布尔值
    let boolean1 = true
    
    /// 另一个简单的布尔值
    let boolean2 = false
    
    /// 使用 AND、OR 和 NOT 计算一个新布尔值
    let boolean3 = not boolean1 && (boolean2 || false)
    
    // 字符串
    // ---------------------------------------------------------------
    
    /// 一个简单字符串
    let stringA  = "Hello"
    
    /// 另一个简单字符串
    let stringB  = "world"
    
    /// 使用字符串串联计算的“Hello world”
    let stringC  = stringA + " " + stringB
    
    /// 使用 .NET 库函数计算的“Hello world”
    let stringD = String.Join(" ",[| stringA; stringB |])
      // 尝试重新键入上面的行以查看 Intellisense 是如何起作用的
      // 注意,针对(部分)标识符按 Ctrl-J 时将重新激活它
    
    // 功能列表
    // ---------------------------------------------------------------
    
    /// 空列表
    let listA = [ ]           
    
    /// 包含 3 个整数的列表
    let listB = [ 1; 2; 3 ]     
    
    /// 包含 3 个整数的列表,注意,:: 是“cons”运算
    let listC = 1 :: [2; 3]    
    
    /// 使用递归函数计算一个整数列表的总和
    let rec SumList xs =
        match xs with
        | []    -> 0
        | y::ys -> y + SumList ys
    
    /// 列表的总和
    let listD = SumList [1; 2; 3]  
    
    /// 介于 1 和 10 之间的整数(含 1 和 10)的列表
    let oneToTen = [1..10]
    
    /// 前 10 个整数的平方
    let squaresOfOneToTen = [ for x in 0..10 -> x*x ]
    
    
    // 可变数组
    // ---------------------------------------------------------------
    
    /// 创建一个数组
    let arr = Array.create 4 "hello"
    arr.[1] <- "world"
    arr.[3] <- "don"
    
    /// 通过对数组对象使用实例方法计算数组的长度
    let arrLength = arr.Length        
    
    // 使用切片表示法提取子数组
    let front = arr.[0..2]
    
    
    // 更多集合
    // ---------------------------------------------------------------
    
    /// 一个包含整数键和字符串值的字典
    let lookupTable = dict [ (1, "One"); (2, "Two") ]
    
    let oneString = lookupTable.[1]
    
    // 有关其他一些常见的数据结构,请参见:
    //   System.Collections.Generic
    //   Microsoft.FSharp.Collections
    //   Microsoft.FSharp.Collections.Seq
    //   Microsoft.FSharp.Collections.Set
    //   Microsoft.FSharp.Collections.Map
    
    // 函数
    // ---------------------------------------------------------------
    
    /// 一个对其输入求平方的函数
    let Square x = x*x              
    
    // 跨值列表映射函数
    let squares1 = List.map Square [1; 2; 3; 4]
    let squares2 = List.map (fun x -> x*x) [1; 2; 3; 4]
    
    // 管线
    let squares3 = [1; 2; 3; 4] |> List.map (fun x -> x*x) 
    let SumOfSquaresUpTo n = 
      [1..n] 
      |> List.map Square 
      |> List.sum
    
    // 类型: 联合
    // ---------------------------------------------------------------
    
    type Expr = 
      | Num of int
      | Add of Expr * Expr
      | Mul of Expr * Expr
      | Var of string
      
    let rec Evaluate (env:Map<string,int>) exp = 
        match exp with
        | Num n -> n
        | Add (x,y) -> Evaluate env x + Evaluate env y
        | Mul (x,y) -> Evaluate env x * Evaluate env y
        | Var id    -> env.[id]
      
    let envA = Map.ofList [ "a",1 ;
                            "b",2 ;
                            "c",3 ]
                 
    let expT1 = Add(Var "a",Mul(Num 2,Var "b"))
    let resT1 = Evaluate envA expT1
    
    
    // 类型: 记录
    // ---------------------------------------------------------------
    
    type Card = { Name  : string;
                  Phone : string;
                  Ok    : bool }
                  
    let cardA = { Name = "Alf" ; Phone = "(206) 555-0157" ; Ok = false }
    let cardB = { cardA with Phone = "(206) 555-0112"; Ok = true }
    let ShowCard c = 
      c.Name + " Phone: " + c.Phone + (if not c.Ok then " (unchecked)" else "")
    
    
    // 类型: 类
    // ---------------------------------------------------------------
    
    /// 二维矢量
    type Vector2D(dx:float, dy:float) = 
        // 预先计算的矢量长度
        let length = sqrt(dx*dx + dy*dy)
        /// 沿 X 轴的位移
        member v.DX = dx
        /// 沿 Y 轴的位移
        member v.DY = dy
        /// 矢量的长度
        member v.Length = length
        // 按某个常量重新缩放矢量
        member v.Scale(k) = Vector2D(k*dx, k*dy)
        
    
    // 类型: 接口
    // ---------------------------------------------------------------
    
    type IPeekPoke = 
        abstract Peek: unit -> int
        abstract Poke: int -> unit
    
                  
    // 类型: 带有接口实现的类
    // ---------------------------------------------------------------
    
    /// 一个用于计算其被发送的次数的小组件
    type Widget(initialState:int) = 
        /// 该小组件的内部状态
        let mutable state = initialState
    
        // 实现 IPeekPoke 接口
        interface IPeekPoke with 
            member x.Poke(n) = state <- state + n
            member x.Peek() = state 
            
        /// 是否已发送该小组件?
        member x.HasBeenPoked = (state <> 0)
    
    
    let widget = Widget(12) :> IPeekPoke
    
    widget.Poke(4)
    let peekResult = widget.Peek()
    
                  
    // 输出
    // ---------------------------------------------------------------
    
    // 输出一个整数
    printfn "peekResult = %d" peekResult 
    
    // 对一般输出使用 %A 来输出结果
    printfn "listC = %A" listC
  • 相关阅读:
    区块链技术的自我见解
    Nengo 神经网络
    elasticsearch更新操作问题
    elasticsearch httpclient认证机制
    spring 常见的注解
    elasticsearch插入索引文档 对数字字符串的处理
    Elasticsearch搜索含有数字标签的处理
    Elasticsearch 插入地理索引文档一直为空
    UVA-10163 Storage Keepers (0-1背包)
    UVA-1632 Alibaba (区间DP+滚动数组)
  • 原文地址:https://www.cnblogs.com/freeliver54/p/3941105.html
Copyright © 2011-2022 走看看