【发布时间】:2016-04-13 15:16:15
【问题描述】:
我正在玩 Haskell 中的一个玩具项目。我正在实现一些我之前用其他语言构建的数据结构,以熟悉它们在 Haskell 中的构建方式。这不是我的第一个函数式语言,我已经在 OCaml 中构建了几个项目,比如 Scheme 解释器,但我认为我的 OCaml 经验正在影响我解决这个问题的方式。它不是非常重要,但可能对上下文有用,知道我正在实现的数据结构是 PR-Quadtree。
我想要做的是匹配和解构守卫内的类型,即 OCaml 的匹配语句。
data Waypoint = WayPoint {
lat :: Float,
lon :: Float,
radius :: Float,
speed :: Float,
accel :: Float
} deriving (Show)
data Region = Region {
x :: Float,
y :: Float,
width :: Float
} deriving (Show)
data PRQuadtree = WhiteNode Region
| BlackNode Region Waypoint
| GreyNode {
topLeft :: PRQuadtree,
topRight :: PRQuadtree,
botLeft :: PRQuadtree,
botRight :: PRQuadtree,
region :: Region
} deriving (Show)
getRegion node
| BlackNode(r, _) = r
| WhiteNode(r) = r
| GreyNode = region node
getRegion 函数是我特别遇到的问题。如果我想要做的事情不清楚:我想简单地提取参数的一个元素,但这取决于参数是代数数据类型的哪个成员。在 OCaml 中我可以这样做:
let getRegion node = match node with
| BlackNode(r, _) = r
| WhiteNode(r) = r
| GreyNode = region(node)
(或类似的东西,我的 OCaml 现在有点生锈了)。
然而,在 Haskell 中,这似乎并没有将 r 绑定到保护分支的 RHS 范围内。我尝试查找 Pattern Guards,因为它们听起来与我可能想要做的相似,但我无法真正了解这里发生了什么。真的,我只想从 = 的 LHS 到 equals 的 RHS 绑定(取决于我们已经关闭的守卫的哪个分支)。
什么是惯用的 Haskell 方式来做我在这里尝试做的事情?
【问题讨论】:
标签: haskell functional-programming pattern-matching