f#中的代数数据类型如何工作?我想看一个基本的示例程序来解释它,但似乎找不到任何东西。
例如,可能是执行二次公式的代码或找到形状区域的解决方案。
答案 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构建的,例如int
,char
,string
等,以及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