模式匹配的变量值

时间:2014-05-20 08:19:11

标签: haskell

只是盯着Haskell。我想定义一些元素来轻松地在它们之间创建态射。

a = "foo"
b = "bar"

g a = a --Problem is here
g b = a --Problem is here

编辑问题是haskell将“g a”中的“a”视为变量,但实际上我想要上面定义的“a”的值。从概念上讲,想要这个

g (valueOf a) = a --Problem is here
g (valueOf b) = a --Problem is here

valueOf是一个神奇的功能,可以给我

g "foo" = a
g "bar" = a

2 个答案:

答案 0 :(得分:7)

使用

a = "foo"
b = "bar"

g x | x==a = a
    | x==b = a

g "foo" = a
g "bar" = a

使用

中的变量模式匹配时
g a = ...

变量a是局部变量,绑定到函数的参数。即使a已全局定义,上述代码也不会使用全局a的值来执行比较。

这种语义允许在本地推理您的代码。以此代码为例:

f 2 x = 4
f c d = 0

通过查看上面的定义,您可以看到f 2 34。如果您稍后为x添加定义,则不会更改此内容,如下所示:

x = 5

f 2 x = 4
f c d = 0

如果匹配语义将第二个参数与5进行比较,那么现在我们将f 2 3等于0。这将使得函数定义的推理更加困难,因此大多数(如果不是全部)函数语言(如Haskell)使用“局部”变量进行模式匹配,忽略了这些变量的可能全局定义。


更具冒险性的选择是使用view patterns

{-# LANGUAGE ViewPatterns #-}
a = "foo"
b = "bar"
g ((==a) -> True) = ...
g ((==b) -> True) = ...

我不是这种方法的粉丝,因为我发现标准图案的防护更清晰。

答案 1 :(得分:3)

如果这完全是对什么的误解,请提前道歉 你想完成但不会这样做吗?

Data Obj = A | B

g A = A
g B = A

f A = "foo"
f B = "bar"

你想要一组预定义的对象,是吗?