代数数据类型的"代数"表达式对于具有数学背景的人来说非常具有启发性.让我试着解释一下我的意思.
定义了基本类型
•+X1并使用简写X²的X•X和2X对X+X等等,我们就可以定义如链表代数表达式
data List a = Nil | Cons a (List a) ↔ L = 1 + X • L
和二叉树:
data Tree a = Nil | Branch a (Tree a) (Tree a) ↔ T = 1 + X • T²
现在,我作为数学家的第一直觉是坚持这些表达方式,并试图解决L和T.我可以通过重复替换来做到这一点,但似乎更容易滥用符号,并假装我可以随意重新排列.例如,对于链接列表:
L = 1 + X • L
(1 - X) • L = 1
L = 1 …
ocaml haskell functional-programming algebraic-data-types miranda
F#派生自OCaml,但缺少或添加了哪些主要项目?具体来说,我很好奇可用于学习OCaml的资源是否对想要学习F#的人有用.
在其他任何地方都没见过这个"功能".我知道第32位用于垃圾收集.但是为什么它只是针对整数而不是其他基本类型呢?
在像Haskell这样的纯函数式语言中,是否存在一个算法来获取函数的逆,当它是双射的时(编辑)?是否有一种特定的方式来编程你的功能呢?
为什么F#中的函数和Ocaml(可能还有其他语言)默认不是递归的?
换句话说,为什么语言设计者决定明确地让你输入如下rec声明是一个好主意:
let rec foo ... = ...
Run Code Online (Sandbox Code Playgroud)
并且默认情况下不提供函数递归功能?为什么需要显式rec构造?
我一直在考虑这个问题,但实际上无法在Google上找到答案以及Stackoverflow上的类似问题.如果有重复,我很抱歉.
许多人似乎都说,在函数式语言(如OCaml和Haskell)中编写编译器和其他语言工具比使用命令式语言编写它们更有效,更容易.
这是真的?如果是这样的话 - 为什么用函数式语言而不是像C这样的命令式语言来编写它们是如此高效和容易?另外 - 在一些函数式语言中,语言工具不是像C这样的低级语言吗?
它似乎是某些类型的等效比较,但不是字符串.
# 3 != 3;;
- : bool = false
# 3 != 2;;
- : bool = true
Run Code Online (Sandbox Code Playgroud)
这是预期的.
# "odp" = "odp";;
- : bool = true
# "odp" != "odp";;
- : bool = true
# "odp" <> "odp";;
- : bool = false
Run Code Online (Sandbox Code Playgroud)
为什么"odp" != "odp"评估true?它到底在做什么?它不应该生成类型错误?
我希望在一个新项目中使用Haskell或OCaml,因为R太慢了.我需要能够使用支持vectory机器,理想情况下将每个执行分开并行运行.我想使用一种函数式语言,我觉得这两者在性能和优雅方面都是最好的(我喜欢Clojure,但它在短期测试中并不那么快).我倾向于OCaml,因为似乎有更多支持与其他语言的集成,所以从长远来看它可能更适合(例如OCaml-R).
有没有人知道在Haskell或OCaml中进行这种分析或代码示例的好教程?