【F#从入门到实战】01. F#语言快速入门

举报
jackwangcumt 发表于 2021/04/27 16:57:39 2021/04/27
【摘要】 函数式编程语言比较适合做数学公式推导,可以进行符号计算,比如求取某一个数学公式的导数或者积分,或者对公式进行化简操作等,本文先介绍一下F#基本语法。

      欢迎大家来到【F#从入门到实战】,在这里我将分享关于F#编程语言的系列文章,带大家一起去学习和成长,并探索函数编程语言F#这个有趣的世界。所有文章都会结合示例代码和笔者的经验进行讲解,真心想把十余年的IT经验分享给大家,希望对您有所帮助,文章中也定有不足之处,请海涵!本系统文章将从F#基于语法入手,逐步通过自定义类型来实现数学表达式的各种常见解析操作,如对表达式进行求值、化简、展开、求导和求积分等。此系统博文也是了解和实现一个简易的计算机代数系统的基础。

     本文作为首篇博文,下面给出【F#从入门到实战】系统专题文章的目录:

【F#从入门到实战】01. F#语言快速入门 
【F#从入门到实战】02. F#数组常见用法   
【F#从入门到实战】03. F#自定义操作符 
【F#从入门到实战】04. F#5.0新特征总结 
【F#从入门到实战】05. F#表达式求值     
【F#从入门到实战】06. F#表达式化简    
【F#从入门到实战】07. F#表达式展开    
【F#从入门到实战】08. F#大整数阶乘    
【F#从入门到实战】09. F#表达式求导   
【F#从入门到实战】10. F#表达式积分   
【F#从入门到实战】11. F#库FParsec入门  
【F#从入门到实战】12. F#库FParsec解析表达式   
【F#从入门到实战】13. F#库FParsec实现求导符号计算   
【F#从入门到实战】14. F#实现分部积分法   

     下面将介绍第一篇博文《F#语言快速入门》:

1.函数式编程语言概述

       最近几年,函数式编程语言异常火爆,而函数式编程语言有天然的优势,如数据的不可变性,无需锁机制即可在并发条件下执行,无副作用。它将函数作为普通数据类型一样,可以作为某个函数的参数,或者当作函数的返回值。另外,函数式编程语言最重要的基础是λ演算,即lambda calculus。λ演算是一个由λ项定义和变换规则组成的形式系统(Formal System),它通过λ项和对λ项的变换操作来表达计算。

     函数式编程语言比较适合做数学公式推导,可以进行符号计算,比如求取某一个数学公式的导数或者积分,或者对公式进行化简操作等。函数式编程语言其实已经存在几十年了,只是非常长的时间内都活跃于学术界,而不是商业界。

     常见的函数式编程语言有:
     Lisp
     Scheme
     OCaml
     Haskell
     Julia
     F#

     F#是微软研发的,基于.NET平台的函数式编程语言,且已经开源,当前的最新版本为F#5.0 ,它随.NET 5 一起发布的。使用F#非常简单,只需要安装.NET SDK即可,或者可以安装Visual Studio或Visual Studio Code进行代码开发和调试。官网地址为: https://docs.microsoft.com/zh-cn/dotnet/fsharp

2.F#语言快速入门

    在安装成功F#开发环境后,可以在命令行运行如下命令开启F#交互模式:

    dotnet fsi

  01.jpg

   在此界面中,可以输入:

   let str = "Hello World" ;;

   其中的;;代码命令结束标志,它是交互模式下比较特殊的一点。此时回车后,F#交互模式给出执行结果,其中的str是一个string类型的变量,值为“Hello World”。下面给出简单的语法示例。

(* 多行注释
   定义一个demo01模块
 *)
module demo01

//let 定义不可变对象
let a = 1 + 2
//a <- 6 //mutable不可修改
printfn "%d" a
let xml = @"a = ""hello world"""

printfn "%s" xml

let a1, b, c, d = 3.14F, 4.14, 0.78M, 123I

(*
  val a1 : float32
  val b : float
  val c : decimal
  val d : System.Numerics.BigInteger
*)

//函数
let f x = 2.0 * x

let g x = x ** 2.0
let fg = f (g (3.0))
printfn "%f" fg //18.000000

let f1 x = 2.0 * x
let g1 f x = f x
let fg2 = g1 f1 3.0
printfn "%f" fg2 //6.000000



let tp1 = ("Hello", 1)
let (t1, t2) = tp1

printfn "t1=%s,t2=%d" t1 t2 //t1=Hello,t2=1


let xs = [ 1 .. 2 .. 9 ] //val xs : int list = [1; 3; 5; 7; 9]

printfn "xs=%O" xs

let list1 = [ "c"; "o" ]
let list2 = "a" :: list1
//val list2 : string list = ["a"; "c"; "o"]
let list3 = list1 @ list2
//val list3 : string list = ["c"; "o"; "a"; "c"; "o"]

//val sum : list:int list -> int
//rec 表示递归函数
let rec sum list =
    match list with
    | [] -> 0
    | x :: xs -> x + sum xs


printfn "%d" (sum [ 1 .. 10 ]) //55

[ 1 .. 11 ] |> sum |> printfn "%d" //66


let sign x =
    match x with
    | 0 -> 0
    | x when x < 0 -> -1
    | x -> 1


let n = sign 2
printfn "%d" n //1






   

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。