【发布时间】:2016-09-20 04:22:20
【问题描述】:
f# 中的代数数据类型如何工作?我想看一个基本的示例程序来解释它,但似乎找不到任何东西。
例如,可能是执行二次公式的代码或找到形状区域的解决方案。
【问题讨论】:
标签: f# algebra algebraic-data-types
f# 中的代数数据类型如何工作?我想看一个基本的示例程序来解释它,但似乎找不到任何东西。
例如,可能是执行二次公式的代码或找到形状区域的解决方案。
【问题讨论】:
标签: f# algebra algebraic-data-types
algebraic data types 中的形容词 algebraic 不是指用于解决代数问题的类型,例如
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和summation的代数运算符组成的,但更重要的是,代数数据类型是基于type theory 并成为formal system 带来正式系统的所有好处。
另外值得注意的是声明元组类型的运算符和用于创建元组值的运算符的区别,例如
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 在与值一起使用时都必须有一个case identifier。
当您了解有关 ADT 的更多信息时,您会遇到 generalized algebraic data type,但遗憾的是 F# 没有它们,而是 requested。
Mark Seemann 提供了 Tomas Petricek 的 Power of mathematics - Reasoning about functional types 链接。然后 Tomas 有一个死链接 fairly readable introduction 但这里是或类似的东西:What the Heck are Algebraic Data Types? ( for Programmers ) 或我更喜欢 Chris Taylor 使用 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
【讨论】:
I was forcibly assigned to F#. 如果我有 F# 分配给我,我会很高兴;你对 F# 不满意吗?我问是因为如果你有这个问题,那么其他人也会有这个问题,虽然我们使用 F# 并不声称它是一种完美的语言,但我们通常确实发现它是一种实用且有用的语言。有裂缝和缺陷,但优点往往大于缺点。