【发布时间】:2015-01-13 16:25:07
【问题描述】:
我有一个简单的列表结构,其中每个叶子都包含两个值(a 和 b),每个节点都包含一个值(a)
data List a b = Leaf (a, b) | Node (a, (List a b)) deriving Show
我有这个函数只是返回一个节点的值或叶子的第一个值
func (Leaf (a, b)) = a
func (Node (a, c)) = a
有没有办法避免这些模式匹配之一?事实上,我正在研究具有多个参数的三叉树和函数,所以我有很多模式匹配,它们都在做同样的事情。
我想过这样的事情
func (var (a, b)) = a
其中 var 可以是叶子或节点,但这不起作用。
【问题讨论】:
-
(a, b)实际上可以被认为是一个值。答案是,我认为,no,或者至少 no,除非你可以使用 SYB。 -
作为一个附带问题,您的语法比您需要的要多。你可以做等效的结构
List a b = Leaf a b | Node a (List a b),然后将这两个模式定义为top (Leaf a _) = a和top (Node a _) = a。 -
“变量”这个词在 Haskell-Land 中是一个诅咒词。这个词是datatype,而不是'datavariable'。
标签: list variables haskell tree