【问题标题】:Using algebraic data types for F# to solve algebra problems使用 F# 的代数数据类型解决代数问题
【发布时间】:2016-09-20 04:22:20
【问题描述】:

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

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

【问题讨论】:

标签: f# algebra algebraic-data-types


【解决方案1】:

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 typesintcharstring等和productsummation的代数运算符组成的,但更重要的是,代数数据类型是基于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

【讨论】:

  • 所以基本上,F# 只是一种类似于 Pyret 的函数式编程语言?
  • 这是我第一次听说Pyret,但在快速阅读介绍段落后,我同意它们都是ML family 的功能语言,但我找不到ADT Pyret,以及我对 Pyret 类型系统的了解很少,我不会说从一种转换到另一种会很容易,因为类型系统有多么不同。
  • 虽然您已经提出了问题并得到了答案,但此评论让我相信您正在寻找 Pyret 的帮助,但让 Pyret 接近 F# 并从那里出发。问一个关于 Pyret 和 F# 类型系统之间差异的新问题会很有趣,但我不知道有谁能回答,包括我自己。
  • 不,不是。我们在编程语言课上讨论了 Pyret,不得不寻找语言并通过示例程序解释它们的“独特之处”。
  • I was forcibly assigned to F#. 如果我有 F# 分配给我,我会很高兴;你对 F# 不满意吗?我问是因为如果你有这个问题,那么其他人也会有这个问题,虽然我们使用 F# 并不声称它是一种完美的语言,但我们通常确实发现它是一种实用且有用的语言。有裂缝和缺陷,但优点往往大于缺点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多