F#表达式求值

简介: 重点介绍如何用F#求表达式 ( a + x ) * b 的值

    前一个博客简单对F#语言的基本情况和语法进行了一个概述,本篇则重点讲一次,如何用F#实现数学表达式的计算问题,当然了,F#还可以进行代数运算,比如求解微分和积分。这里我们先从简单的表达式开始,比如有一个表达式 ( a + x ) * b ,当 a = 1,b = 3,x = 2时,如何求出该表达式的值。

   这里为了更加通用,并不能定义一个f(a,b,x) =  ( a + x ) * b,而这个表达式可变的,比如 x * 2 或者 (x + 2) * (x + 3 ) 。因此,这里需要定义一个自定义的表达式数据类型:

typeExpr=|CstFoffloat|Varofstring|AddofExpr*Expr// +|SubofExpr*Expr// -|MulofExpr*Expr// *|DivofExpr*Expr// / ;;

   其中的type关键字定义了一个数据类型Expr , 其中包含CstF常数,这里定义一个float类型的,如2.8,整数的化,可以表示为2.0 。Var 代表一个变量类型,它是一个字符串类型,比如"x" 。定义一个变量可以用 Var "x"表示。

   Add 代表 四则运算中的加法操作,它接收两个参数,都是 Expr。同理,Sub代表减法,Mul代表乘法,Div代表除法。当然其他的操作可以根据需要进行扩展,比如Sin of Expr 。下面给出几个表达式的定义示例:

lete1=CstF7.;; // 7.0lete2=Add(CstF3.0, Var"x");; // 3.0 + xlete3=Mul(e2, Var"a");; // (3.0 + x) * a

  回到之前提到的问题,如何用F#求表达式 ( a + x ) * b 的值,其中的a , b ,x 在计算的时候,需要指定具体的参数值,比如 a = 7.2,b = 6.5,x = 3.0。首先需要给出一个上下文变量的容器:

(*上下文变量 (string*float) list*)
letenv= [("x", 3.); ("a", 7.2); ("b", 6.5); ("c", 2.)];;

   有了这个上下文环境标量列表,定义一个查找的函数,来根据变量来查询变量值,比如 变量 x 返回 3.0 。

//从上下文环境中查找变量值letreclookupenvx=matchenvwith| []        ->failwith (x+" not found")
| (y, v)::r->ifx=ythenvelselookuprx;;

   这个查找函数是一个递归函数,它会每次取出列表的一个元素,并进行查找,如果找到,则返回变量值,如果未找到,则继续从剩余的列表元素中查找变量值。下面则定义一个执行计算的的函数:

(*计算*)
letrecevale (env : (string*float) list) : float=matchewith|CstFf->f|Varx->lookupenvx|Add(e1, e2) ->evale1env+evale2env|Mul(e1, e2) ->evale1env*evale2env|Sub(e1, e2) ->evale1env-evale2env|Div(e1, e2) ->evale1env/evale2env|_->failwith"unknown operation";;

   这里用到模式匹配的强大功能,这里需要注意,匹配的规则是有顺序的,它只要匹配到一条后,就会返回结果。因此,越是具体的,详细的,越是要放前面,抽象的,复杂的,放下面。下面给出示例代码:

>lete1=Add(CstF3.0, Var"x");;
vale1 : Expr=Add (CstF3.0, Var"x")
>lete2=Mul(Add(CstF3.0, Var"x"),Var"a");;
vale2 : Expr=Mul (Add (CstF3.0, Var"x"), Var"a")
>evale1env;;
valit : float=6.0>evale2env;;
valit : float=43.2


相关文章
|
NoSQL 编译器 C语言
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。高级技巧包括内存检查、性能分析和符号调试。通过实践案例学习如何有效定位和解决问题,同时注意保持耐心、合理利用工具、记录过程并避免过度调试,以提高编程能力和开发效率。
572 1
|
机器学习/深度学习 算法 数据挖掘
Python4
### 2.3 Python数据挖掘建模常用框架和库 Python 拥有丰富的第三方库,在数据挖掘领域应用广泛。常用框架包括 TensorFlow、Keras、PyTorch、PaddlePaddle 和 Caffe 等;常用库则有 scikit-learn、jieba、SciPy、OpenCV、Pillow、Gensim 和 SnowNLP等。
192 9
|
Java
Future:异步任务结果获取
Future:异步任务结果获取
213 0
|
测试技术
分享两个在开发中需注意的小点
分享两个在开发中需注意的小点
89 0
|
人工智能
2023年8款好用免费可商用字体|标小智龙珠体
为了庆祝新的一年的开始,我筛选整理了一份8款实用且免费商用的中文字体清单。这些字体不仅易于使用,而且风格多样,可以用于logo设计、平面设计、标题设计等等,希望能够帮助到你。
2023年8款好用免费可商用字体|标小智龙珠体
|
数据采集 自然语言处理 监控
基于.Net开发的、支持多平台、多语言餐厅点餐系统
基于.Net开发的、支持多平台、多语言餐厅点餐系统
431 0
|
Rust 算法 开发者
【Rust 控制流入门指南】 Introduction to Control Flow in Rust
【Rust 控制流入门指南】 Introduction to Control Flow in Rust
184 0
剑指 Offer 53 - I:在排序数组中查找数字 I
剑指 Offer 53 - I:在排序数组中查找数字 I
105 0
|
安全 数据可视化 关系型数据库
何远程连接阿里云主机服务器(Linux系统)
何远程连接阿里云主机服务器(Linux系统)
2242 57
何远程连接阿里云主机服务器(Linux系统)

热门文章

最新文章