【发布时间】:2020-12-09 05:49:43
【问题描述】:
我有一个表示方向的类型,它有一个轴和一个方向:
data Dir = DirX | DirY | DirZ | DirW deriving (Show, Eq)
data Sign = Pos | Neg deriving (Show, Eq)
newtype Direction = Direction (Dir, Sign) deriving (Show, Eq)
这看起来有点过于复杂了。我不需要 Sign 和 Dir 是不同的类型,我只想将事物与它们的构造函数进行模式匹配。那么有没有更好的方法来定义这种类型?
所以我想做的是某种
data Direction = Direction (DirX | DirY | DirZ | DirW) (Pos | Neg) deriving (Show, Eq)
因为我做\(Direction _ s) -> if s == Pos then ... else ...之类的事情,但我从不在Direction之外使用Dir或Sign
我想我不是第一个问这个问题的人,但我真的不知道如何用谷歌搜索这个问题。
【问题讨论】:
-
好吧,我认为您不应该将其包装在 2 元组中,您可以使用
data Direction = Direction Dir Sign deriving (Show, Eq),但是,我并不真正理解问题所在。如果您希望类型是参数化的,您可以创建一个参数数据类型,例如data Direction dir sign = Direction dir sign deriving (Eq, Show),然后使用Direction Dir Sign来指定特定于此的数据类型。 -
我不明白为什么你不需要
Sign和Dir是不同的类型。一个有 4 个可能的值,另一个有 2 个。为什么它们应该是相同的类型呢?除此之外,使用不同的类型将防止方向和符号之间的混淆,例如错误地传递错误的值。我的意思是,您可以简单地使用(Int, Int)并避免超出范围的值,但这将非常脆弱,因为您会使无效值可表示。 -
@DEYTD:欢迎来到 Stack Overflow!我认为,如果您编辑问题以添加以下内容,这将有助于人们提供解决方案:1. 使用这些类型的现有代码的小示例,以及 2. 您希望能够编写的代码示例.就目前而言,您想做什么有点不清楚。
-
我认为问题是希望有一种匿名类型。如果 Sign 的唯一目的是用作悬挂 Direction 中使用的构造函数的地方,那么希望您不必给它指定一个与 Direction 不同的命名类型是合情合理的。但它并不能真正经得起深入审查,因此 Haskell 没有这样的功能。
-
@chi 问题是
Sign或Dir是一种具有有限可能值的类型,Direction是。但我认为像我一样定义它会更方便一些,然后通过 8 个不同的构造函数。
标签: haskell types enums anonymous-types algebraic-data-types