Haskell 数据变量

Haskell data variable

我有这个简单的列表结构,其中每个叶子都有两个值(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 可以是叶子或节点,但这不起作用。

如果您对此感到满意,可以将您的类型重构为:

data List a b = L (a, Either b (List a b)) deriving Show

然后,

func :: List a b -> a
func (L (a,_)) = a

以前的值如

Leaf (a, b)
Node (a, list)

现写成

L (a, Left b)
L (a, Right list)

根据您的代码,这可能更方便使用。

但是,请记住,如果您需要访问该对的第二个组件,则无论如何都需要进行模式匹配。总体而言,您当前的数据类型可能比此替代方法更方便。

我"solved"它通过添加一个返回第一个值的帮助函数

gf (Leaf (a, b)) = a
gf (Node (a, b)) = a

所以我可以一直使用这个功能

func x = gf x

仍然有两个模式匹配,但如果需要多个参数的更复杂的函数,避免大量模式匹配会很有用

addValues (Leaf (a, b)) (Leaf (c, d)) (Leaf (e, f)) = a + c + e 
addValues (Leaf (a, b)) (Leaf (c, d)) (Node (e, f)) = a + c + e 
addValues (Leaf (a, b)) (Node (c, d)) (Leaf (e, f)) = a + c + e 
addValues (Leaf (a, b)) (Node (c, d)) (Node (e, f)) = a + c + e 
addValues (Node (a, b)) (Leaf (c, d)) (Leaf (e, f)) = a + c + e 
addValues (Node (a, b)) (Leaf (c, d)) (Node (e, f)) = a + c + e 
addValues (Node (a, b)) (Node (c, d)) (Leaf (e, f)) = a + c + e 
addValues (Node (a, b)) (Node (c, d)) (Node (e, f)) = a + c + e

现在可以写成

addValues (a, b, c) = (gf a) + (gf b) + (gf c)