Facebook Twitter LinkedIn E-mail
magnify
formats

F#开发教程(1):概述

函数化编程

F#是一种函数优先的强类型语言,但它支持类型推断(type inference),一般不需要在代码在明确指明变量,数值,参数的类型,编译器可以根据上下文推断出变量,数值,参数的类型。当然你愿意的话,也可以指明变量,数值,参数的类型。
F#是一个以表达式为主的语言,程序运行时以一种比较积极的方式来演算这些表达式(eager evaluation).F#中所有的语句包括if表达式,try表达式和循环都可以返回某种类型的值。那些不需要返回值的函数和表达式返回unit类型的值。F#使用let来绑定一个值到一个名称(别的语言中一般称为变量,F#如果使用变量有些名不符实,F#let一般绑定的值是不可以更改的非变量)。
比如

let x = 3 + 4

绑定x到整数7.

F#使用type来定义新的类型F#,对于函数化编程,F#支持元组(tuple),记录(record),联合(discriminated union),列表(list)以及可选(option)类型。
元组(tuple)类型代表有n个数值的集合数据类型,比如一个三元组可以代表(A,B,C),其中A,B,C可以代表任何类型的数据。
记录(record)类型有点类似C#中的结构类型,和元组相比,记录类型的数据成员可以有名字,比如{ Name:string;Age:int}, F#使用with来创建一个记录的拷贝,比如 { r with Name =”CD”}。
可区分联合(discriminated union)或者简称为联合类型类似为C中的联合类型,但它为一类型安全的联合类型。比如

type A =
  | UnionCaseX of string
  | UnionCaseY of int

这个联合类型的值可以为两个类型其中任意一种。
列表(list)类型为一不可以更改链表结构,它可以使用head::tail来表示。::为列表合并操作符。列表页使用[item1;item2;item3 …]来定义,[]为空表。
可选(option)类型为一联合类型,一个类型为None,表示没有值,另外一个类型为Some(x),其中x可以为任意类型的数据。
F#的类型可以为通用类型。
F#支持lambda表示式,支持闭包(closure)。F#中所有函数类型为一等公民并且是不可以更改的。函数支持柯里化(curried,部分函数),由于函数类型为一等公民,因此和其它基本类型(int,string等)一样可以作为其它函数的参数,和其它函数化编程语言一样,F#支持使用< <,>>来构成组合函数。
F#支持序列表达式来通过代码生成定义序列 seq {…},列表 list[…]和数组 [|…|]。比如

 seq { for b in 0 .. 25 do
           if b  < 15 then
               yield b*b}

构造0-14的平方。序列(数列)为一构造器(描述数列中元素的特征),序列中的值在有需要是才生成。这个数组和列表不同。因此序列可以用来表示无限数列。
F#也支持模式匹配(pattern matching),使用模式匹配可以把数值绑定到名称。模式匹配功能异常强大。

指令性编程(面向过程编程)

  • F#的指令性编程包括
  • for 循环指令
  • while 循环指令
  • 使用[|…|]构造数组
  • 使用dict […] 或者 System.Collections.Generic.Dictionary构造哈希表

数值或记录类型如果需要支持更改 (变量),可以使用mutable 来修饰。比如

 let mutable x = 1
 x <- 3

 

面向对象编程

F#和其它CLI语言,支持面向对象编程,F#支持面向对象的表达式种类如下:

  • 使用.来引用对象的属性或函数,比如 x.Name
  • 对象表达式,比如 {new obj() with member x.ToString() = “hello” })
  • 对象构造函数
  • 类型测试 ,比如 x : ? string
  • 类型强制转换 比如 x :?> string
  • 命名参数
  • 命名setter ,比如 new Form (Text =”hello”)
  • 可选参数 比如 x.Method (OptionalArg =1)

F#的对象类型type定义可以用来定义类似C#中class,struct, interface,enum ,delegate类型,比如下面代码使用type定义一个class

  type Person (name :string, age :int) = 
      member x.Name = name
      member x.Age = age

 

此外F#支持异步,并行编程,命名空间(namespace),模块定义(module),可以定义数值使用的“量词”(units of measure) 等等。
最后需要特别说明的是F#代码空格是有意义的,缩进代表了语句的层次关系,它通常不使用{},;来分隔语句。

 
Tags:
 Share on Facebook Share on Twitter Share on Reddit Share on LinkedIn
F#开发教程(1):概述已关闭评论  comments 
formats

F#开发教程

有快两年时间没怎么更新博客了,最近决定重新开始更新博客,一时也没想好写哪个方面的比较好,想起之前写过Scala教程,最近偶然的接触了F#,和Scala语言非常类似,就如同C#和Java也比较类似。因为也是刚开始接触F#,还是以翻译参考为主,这个系列主要参考由Apress 出版Robert Pickering编写的《开始F#4.0编程》第二版的第三章到第七章的内容。学完这几章也就可以算是初窥F#门墙。

F#是由微软发展的为微软.NET语言提供运行环境的程序设计语言,是函数编程语言FP,Functional Programming),函数编程语言最重要的基础是Lambda Calculus。它是基于OCaml的,而OCaml是基于ML函数程序语言。有时F#和OCaml的程序是可以交互编译的。

F#已经接近成熟,支持高阶函数、柯里化惰性求值、Continuations、模式匹配、闭包、列表处理和元编程。这是一个用于显示.NET在不同编程语言间互通的程序设计,可以被.NET中的任意其它代码编译和调用。

目前F#  版本为4.0.1 夸平台支持。支持交互式运行。

F#通常在以下几个方面使用 –

  • 制定科学模型
  • 数学解题
  • 人工智能的研究工作
  • 金融建模
  • 平面设计
  • CPU设计
  • 编译器编程
  • 电信

此外,Xamarin  也支持使用F# 开发Android,iOS ,Windows 手机应用。

 
 Share on Facebook Share on Twitter Share on Reddit Share on LinkedIn
F#开发教程已关闭评论  comments 
formats

摩尔斯电码工具软件Morse Code Toolkit

摩尔斯电码英语:Morse code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母数字标点符号。是由美国人萨缪尔·摩尔斯在1836年发明。

摩尔斯电码是一种早期的数字化通信形式,但是它不同于现代只使用0和1两种状态的二进制代码,它的代码包括五种:

  1. 点(.)
  2. 划(-)
  3. 每个字符间短的停顿(在点和划之间的停顿)
  4. 每个词之间中等的停顿
  5. 以及句子之间长的停顿

Morse Code Toolkit  是一款Android工具软件,可以帮助你在公车上无聊时打发时间,学习Morse电码 🙂

Morse_Code_Toolkit_-_Android_Apps_on_Google_Play

 
 Share on Facebook Share on Twitter Share on Reddit Share on LinkedIn
摩尔斯电码工具软件Morse Code Toolkit已关闭评论  comments 
formats

引路蜂游戏编程指南

Raindrop

Guidebee Android Game Engine – RainDrop Demo To use guidebee android game engine in your project in your build.gradle

add the following

dependencies {
    ...
    compile 'com.guidebee:game-engine:0.9.8'
}

Mario collect coins

Download

Guidebee Android Game Engine Tutorials

  1. Android Gradle Project
  2. Basics
  3. Packages
  4. Game Logic
  5. Basic Graphics
  6. Texture & TextureRegion
  7. TextureAtlas
  8. Handling Input and On Screen Game Pad
  9. Sound and Music
  10. Scenery and TiledMap
  11. SVG Image and Unmanaged Assets
  12. Collision Detection
  13. Microedition Game API
  14. Bring Physics to your Game World
  15. UI Components and HUD Components
  16. Camera and Viewport basics

Box2D

To use guidebee android game engine in your project in your build.gradle

add the following

dependencies {
    ...
    compile 'com.guidebee:game-engine:0.9.9'
}

Mario collect coins

Download

Guidebee Android Game Engine Box2D Tutorials

  1. Introduction
  2. Basic Concepts
  3. Control Player
  4. Body Types
  5. Shape Types
  6. Apply Forces and Impulses to Bodies
  7. Collision Detection and Collision Filter
  8. Sensors
  9. Ray Casts
  10. Joints
  11. More on Bodies
  12. The world
 
 Share on Facebook Share on Twitter Share on Reddit Share on LinkedIn
引路蜂游戏编程指南已关闭评论  comments 
formats

域名注册,虚拟主机 5%折扣

访问 http://www.guidebee.biz 使用促销码: GUIDEBEE05 有效期至2016年9月
可以获取5%折扣。
domains

 
 Share on Facebook Share on Twitter Share on Reddit Share on LinkedIn
域名注册,虚拟主机 5%折扣已关闭评论  comments 
formats

Play Framework Web开发教程(36): 多国语言支持

你所写的Web应用的用户可能来自不同的国家,他们使用不同的语言,已经使用不同的数字,日期等格式,Play提供了一些工具来帮助你支持应用的国际化。
不同的语言和格式规则成为”locale”,应用适应不同的”locale”称为国际化和本地化。国际化和本地化比较容易混淆,国际化指去除应用中和某些特定“locale”相关的代码。而本地化指构造某个特定locale的应用版本。对于一个支持国际化的应用来说,它应该支持多种可选的语言。在实际应用中,国际化和本地化是同时使用的。
本篇侧重介绍国际化应用中的静态部分(通常你在模板中hardcode的部分或是一些错误信息)。
配置message文件
在Play构造一个本地化的应用涉及如何书写message文件。比如,避免在应用中直接使用如”Log in”,”Thank you for your order”或”Email is required”等文字,我们可以定义一个message文件,对于不同的语言支持,我们分别构造对于的message文件:比如:

welcome = Welcome!
users.login = Log in
shop.thanks = Thank you for your order

这里我们可以看到如果使用message键值来替代实际显示的文字。 这里”.”没有特殊的意义,但可以帮助消息分组。

为了支持多国语言,我们需要在应用的配置文件中定义所要支持的语言,例如,我们修改application.conf文件,支持以下几种语言:

application.langs="en,en-US,nl"

支持的语言使用逗号隔开,支持的语言使用ISO 639-2 语言代码,加上可选的国家代码。比如上面的en-US代码美国英语。

然后,对于不同的语言,我们在conf目录构造对应的message文件,其命名规则为 messages.LANG ,其中LANG 使用具体的语言代码替代。比如法语fr,我们使用messages.fr文件名。
除此之外,我们创建一个不带后缀名的文件messages作为缺省语言,如果某个message没有翻译成所需的语言,那么就使用定义在messages文件中的定义。因此使用多国语言一般首先定义messages文件,确保定义完整的message。这样解释你忘记在某种语言的messages.LANG忘记定义某个键,那么还会显示缺省的文字。

在应用中使用message

在应用中使用message,你可以使用Messages的apply方法,例如:

Messages("users.login")(Lang("en"))

这个方法有两个参数列表,第一个参数列表为消息和消息参数,第二个参数列表为Lang参数,这个参数是一个implicit定义,通常Play应用提供了隐含的Lang定义,这个Lang定义基于机器缺省的locale定义。

Play 框架定义了由Request到Lang的隐含转换,这给我们带来很大的便利。如果在当前作用域有一个隐含的Request,那么就会有一个隐含的Lang定义(基于request的Accept-Language消息头)。比如你有如下的一个action方法:

def welcome() = Action { implicit request =>
  Ok(Messages("welcome"))
}

Play根据请求的消息头来决定使用哪种语言。如果消息头指明可以接受多种语言,那么Play就依次尝试这些语言,然后选取第一个可用的语言。如果消息头没有定义语言,那么Play选用application.conf定义的第一个语言。

同样,你可以在View模板中使用同样的语法来使用消息:

@()
<h1>@Messages("welcome")</h1>

要注意的是,如果你需要支持自动选取语言,那么你需要引入隐含的Request做为模板参数:

@(implicit request: Request)
<h1>@Messages("welcome")</h1>

此外,message 不仅仅支持前面定义的简单的文字串,也可以使用java.text.MessageFormat来格式化,也就是意味着你可以使用参数来定义字符串,例如:

validation.required={0} is required

然后再使用时,使用实际的文字来替换这些参数:

Messages("validation.required", "email")

再比如,你需要根据参数显示不同的信息,比如根据购物框中物品的数量显示不同的信息,可以定义如下的message:

shop.basketcount=Your cart {0,choice,0#is empty|1#has one item
|1< has {0} items}.

然后在应用中如果我们使用如下调用:

<p>@Messages("shop.basketcount", 0)</p>
<p>@Messages("shop.basketcount", 1)</p>
<p>@Messages("shop.basketcount", 10)</p>

那么实际显示:

Your cart is empty.
Your cart has one item.
Your cart has 10 items.
 
Tags: ,
 Share on Facebook Share on Twitter Share on Reddit Share on LinkedIn
Play Framework Web开发教程(36): 多国语言支持已关闭评论  comments