模式匹配的变量值

Cri*_*cia 5 haskell

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

a = "foo"
b = "bar"

g a = a --Problem is here
g b = a --Problem is here
Run Code Online (Sandbox Code Playgroud)

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

g (valueOf a) = a --Problem is here
g (valueOf b) = a --Problem is here
Run Code Online (Sandbox Code Playgroud)

哪个valueOf神奇的功能会给我

g "foo" = a
g "bar" = a
Run Code Online (Sandbox Code Playgroud)

chi*_*chi 7

使用

a = "foo"
b = "bar"

g x | x==a = a
    | x==b = a
Run Code Online (Sandbox Code Playgroud)

要么

g "foo" = a
g "bar" = a
Run Code Online (Sandbox Code Playgroud)

使用变量模式匹配时,如

g a = ...
Run Code Online (Sandbox Code Playgroud)

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

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

f 2 x = 4
f c d = 0
Run Code Online (Sandbox Code Playgroud)

只要看一眼上面的定义可以看出f 2 34.如果稍后添加定义,则不会更改此内容x,如下所示:

x = 5

f 2 x = 4
f c d = 0
Run Code Online (Sandbox Code Playgroud)

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


更具冒险性的选择是使用视图模式:

{-# LANGUAGE ViewPatterns #-}
a = "foo"
b = "bar"
g ((==a) -> True) = ...
g ((==b) -> True) = ...
Run Code Online (Sandbox Code Playgroud)

我不是这种方法的粉丝,因为我发现标准模式与警卫更清晰.