19得票1回答
如果禁止使用case class继承,该如何表示?

我正在尝试按照这篇文章中所述的方式创建案例类。sealed abstract case class Exp() case class Literal(x:Int) extends Exp case class Add(a:Exp, b:Exp) extends Exp case class S...

19得票4回答
C++中代数数据类型的等价物是什么?

假设我有以下的Haskell代码:data RigidBody = RigidBody Vector3 Vector3 Float Shape -- position, velocity, mass and shape data Shape = Ball Float -- radius ...

18得票3回答
Haskell的构造函数(data constructors)构造什么?

Haskell可以使用类型构造器和数据构造器构建代数数据类型。例如,data Circle = Circle Float Float Float 我们被告知这个数据构造器(右侧的圆)是一个函数,当给定数据(例如x、y和半径)时可以构造一个圆。 Circle :: Float -> Fl...

18得票1回答
函数式编程语言如何在内存中表示代数数据类型?

如果你要在Haskell中编写一种生物信息学算法,你可能会使用代数数据类型来表示核苷酸: data Nucleotide = A | T | C | G 我假设在标准ML或OCaml中,您会采取类似的方式(我从未真正使用过任何一种语言)。 显然,类型为Nucleotide的值可以用两个...

17得票3回答
`'a.` and `type a.`之间有什么区别?何时使用每个?

OCaml有几种不同的语法用于多态类型注释: let f : 'a -> 'a = … (* Isn’t this one already polymorphic? (answer: NO) *) let f : 'a. 'a -> 'a = … let ...

17得票1回答
如何在Haskell中创建ADT?

在Scala中,我可以描述这样的ADT:sealed trait Foo case class A(a: Int) extends Foo case class B(b: String) extends Foo case class C(a: A, b: B) extends Foo 我该如何...

17得票3回答
函数式编程中除了单子之外,是否还使用任何代数结构?

我最近了解了函数式编程(在Haskell和Scala中)。它的能力和优雅非常迷人。 但是当我遇到单子Monad时,它使用了一个名为幺半群Monoid的代数结构,我感到惊讶和高兴,因为我一直在数学中学习的理论知识被应用于编程。 这个观察让我产生了一个问题:群、域或环(请参见代数结构了解其他结...

17得票1回答
类型代数和Knuth的上箭头符号

阅读这个问题和这篇博客文章让我更加思考类型代数,特别是如何滥用它。 基本上, 1)我们可以将Either A B类型视为加法:A+B 2)我们可以将有序对(A,B)视为乘法:A*B 3)我们可以将函数A -> B视为指数:B^A 这里显然有一个模式:乘法是重复的加法,指数是重复...

16得票1回答
如何向ADT添加仅缓存某些内容的字段?

经常需要向ADT中添加字段,仅对一些冗余信息进行备忘。但我还没有完全弄清楚如何以漂亮和高效的方式实现它。 最好的方法是举个例子来说明问题。假设我们正在处理未输入的lambda项: type VSym = String data Lambda = Var VSym ...

16得票2回答
为什么归纳数据类型禁止像 `data Bad a = C (Bad a -> a)` 这样的类型,其中类型递归出现在 -> 的前面?

Agda手册中关于归纳数据类型和模式匹配的部分指出: 为了确保规范性,归纳出现必须在严格正位置。例如,下面的数据类型是不允许的:data Bad : Set where bad : (Bad → Bad) → Bad 由于构造函数的参数中存在Bad的负面出现,因此这个要求对归纳数据...