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)
我有这个简单的列表结构,其中每个叶子都有两个值(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)