使用F#的代数数据类型来解决代数问题

时间:2016-05-23 10:20:59

标签: f# algebra algebraic-data-types

f#中的代数数据类型如何工作?我想看一个基本的示例程序来解释它,但似乎找不到任何东西。

例如,可能是执行二次公式的代码或找到形状区域的解决方案。

1 个答案:

答案 0 :(得分:9)

algebraic中的形容词algebraic data types并未引用用于解决代数问题的类型,例如

x + y = 3  or 5 * y = 10

形容词algebraic指的是使用乘法(algebraic)和加法(*)的+运算符构造/声明类型的方式。特别是代数类型可以是product types*),它们是元组,例如。

type Variable = string * int

sum types,使用或字符(|)代替加号字符(+),这些字符是有区别的联合,例如

type Term =
    | Var of Variable
    | Const of Constant
    | App of Constant * Term list

一旦人们理解并改变他们的想法,维基百科关于algebraic data types的文章应该有意义,这将解释为什么你找不到你想要的东西,例如解释如何使用代数数据类型解决代数问题的文章。

本质上,新的类型是从primitive data types构建的,例如intcharstring等,以及product和{的代数运算符{1}}但更重要的是,代数数据类型基于type theory,并且formal system带来了正式系统的所有好处。

同样值得注意的是,运算符用于声明元组类型和用于创建元组值的运算符的区别,例如。

summation

注意类型的type Variable = string * int type ("x",0) value 运算符和值的*运算符。

另外

,

请注意,每个type Term = type | Var of Variable | Const of Constant | App of Constant * Term list Var("x",0) value Const("1") value App("add",[Const("1"),Var("x",0)]) value 与值一起使用时必须有possible option

当您了解有关ADT的更多信息时,您会遇到generalized algebraic data type但遗憾的是F#没有它们,但已经requested

Mark Seemann提供了Tomas Petricek的Power of mathematics - Reasoning about functional types链接。然后托马斯有一个死链接case identifier,但这里有类似的东西:What the Heck are Algebraic Data Types? ( for Programmers )或者我更喜欢克里斯泰勒使用Haskell的系列,但这些想法确实转化为F#:

The Algebra of Algebraic Data Types, Part 1
The Algebra of Algebraic Data Types, Part 2
The Algebra of Algebraic Data Types, Part 3