13得票5回答
在枚举类型上创建函数

我刚开始学习 Haskell。我觉得我已经掌握了基础知识,但我想确保我真的在强制自己以函数式思维方式来思考。data Dir = Right | Left | Front | Back | Up | Down deriving (Show, Eq, Enum) inv Right = Left...

13得票2回答
CPS和代数数据类型相比,有哪些优势要求?

我对代数数据类型没有太多经验,因为我使用的语言不支持。通常可以使用延续传递样式来获取类似的体验,但是处理 CPS 编码类型不太方便。 考虑到这一点,为什么像 Parsec 这样的库要使用 CPS 呢?newtype ParsecT s u m a = ParsecT {unParser...

13得票2回答
为什么我们需要“代数数据类型”?

我阅读了一些关于代数数据类型的解释: 代数数据类型I 代数数据类型II 代数数据类型III 数据的代数和变异的微积分 这些文章提供了非常详细的描述和代码示例。 起初我以为代数数据类型只是为了轻松定义一些类型,然后我们可以使用模式匹配进行匹配。但是阅读了这些文章后,发现根本没有提到“...

13得票5回答
代数类型数据构造函数的“模式匹配”

让我们考虑一个拥有多个构造函数的数据类型: data T = Alpha Int | Beta Int | Gamma Int Int | Delta Int 我想编写一个函数来检查两个值是否由相同的构造函数产生: sameK (Alpha _) (Alpha _) = True sa...

13得票1回答
在这个类型化的λ演算宇宙中,你如何构造n元积类型和求和类型?

这里是我遇到问题的代码:{-# LANGUAGE GADTs, LANGUAGE DataKinds #-} -- * Universe of Terms * -- type Id = String data Term a where Var :: Id -> Ter...

13得票2回答
在Haskell中创建一个类似网格的数据类型

问题 我一直在思考如何高效地完成这个任务,但出于某种原因我一直做不到。我需要建立一个矩形网格,在其中每个字段都包含一些数据。 我需要通过一个拉链访问它,其中我的焦点是一个字段(也就是值)。该拉链应支持goDown、goUp、goLeft和goRight等操作,每个操作将焦点更改为指定方向的字段...

13得票3回答
Haskell数据类型使用的良好实践

读《Real world Haskell》时,我发现了一些关于数据类型的有趣问题: 这种模式匹配和位置数据访问使得你看起来在数据和操作它的代码之间非常紧密耦合(尝试向Book添加某些内容,或更糟糕的是修改现有部分的类型)。 在命令式编程语言(特别是面向对象的语言)中,这通常是...

12得票1回答
一个"Nil"携带值的列表?

有没有一些标准的 Haskell 库定义了这样一个数据类型data ListWithEnd e a = Cons a (ListWithEnd e a) | End e 这是一个列表,其终止元素携带有指定类型的值? 因此,ListWithEnd()同...

12得票1回答
使用关系型数据库建模代数数据类型

假设你正在使用OCaml/F#/SML/Haskell编写应用程序,并想要将数据持久化到关系数据库中。将产品类型(记录和元组)映射到关系很容易,但如何将变量类型映射到关系呢? 具体来说,如果有以下类型,你该如何在关系数据库中进行持久化? (* OCaml *) type t = | ...

12得票4回答
Haskell中的"Dependent optional"数据

考虑一个DateTime类型,日期必须存在,但是秒钟部分是可选的。如果时间部分存在,则可能会有一个可选的毫秒部分。如果毫秒存在,则可能会有纳秒部分。 有很多处理这种情况的方法,例如:--rely on smart constructors data DateTime = DateTime ...