微软自带的f# tutorial

原创 2013年12月02日 16:32:20
module main
// 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


版权声明:本文为博主原创文章,欢迎转载,请注明原文链接

F# 基础

F# 基础 再译《F# 基础》序 前言 第一章     什么是函数编程     函数编程为啥重要     什么是 F#     谁在用F#     谁能读本书 第二章 获得、安装、使用...
  • hadstj
  • hadstj
  • 2014年03月03日 19:38
  • 2031

F#程序设计-入门(1)

      F#是由微软发展的为微软.NET语言提供运行环境的程序设计语言,是函数编程语言(FP,Functional Programming),函数编程语言最重要的基础是Lambda Calculu...
  • minyskirt
  • minyskirt
  • 2009年12月05日 13:36
  • 792

F# 入门

作 为 Microsoft® .NET Framework 家族的新成员,F# 提供类型安全、性能以及类似脚本语言的工作能力,所有这些都是 .NET 环境的一部分。此函数式语言由 ...
  • jackiej
  • jackiej
  • 2010年04月28日 14:22
  • 814

F# 函数式编程

对于什么是函数式编程,这个是人云亦云。本文并不打算对此进行定义,而是希望与园子里的朋友们共同探讨这个话题,抛砖只为引玉。 本文希望通过介绍F#中的语法,来了解函数式编程中专门的概念。 ...
  • zhongjiekangping
  • zhongjiekangping
  • 2011年09月20日 16:15
  • 567

视频教程

又来一大波好东西,赶快收藏,下载吧,淘宝上就不用花钱买了 时间 2014-08-28 15:37:52  CSDN博客 原文  http://blog.csdn.net/u014304293/art...
  • zx249388847
  • zx249388847
  • 2017年01月21日 22:39
  • 1703

教程

空间首页 空间管理 51Testing软件测试网 站点论坛 添加我的日志 我的日志 简明批处理2007-1-26 最近对于批处理技术的探讨...
  • lk_cool
  • lk_cool
  • 2007年07月09日 14:22
  • 3578

ArcGIS初学者的建议一(自带资源利用)

对ArcGIS的学习绝大部分的人都是从ArcMap这个软件下手的(准确来说甚至就是ArcGIS Desktop 的ArcInfo【ArcInfo是在Desktop中的角色类似于win7中的ultima...
  • fenghuayoushi
  • fenghuayoushi
  • 2011年05月21日 01:57
  • 17051

C#调用F#及简单性能对比

在VS2010里已经集成了F#,F#本身是函数型的编程语言,在数学运算方面具备天生的优越性,下面说明如何在C#中调用F#,并简单的从纯语法的角度来比较一下性能。 1.        建立一个F#库 ...
  • begtostudy
  • begtostudy
  • 2010年08月16日 14:25
  • 2077

linux完全教程 Linux 教程

  • 2009年06月22日 12:31
  • 18.77MB
  • 下载

最全的前端资源教程

综合类 地址 前端知识体系 http://www.cnblogs.com/sb19871023/p/3894452.html 前端知识结构 https://github.c...
  • hcz297799265
  • hcz297799265
  • 2017年11月05日 22:38
  • 203
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:微软自带的f# tutorial
举报原因:
原因补充:

(最多只允许输入30个字)