只是盯着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
答案 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 3
是4
。如果您稍后为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"
你想要一组预定义的对象,是吗?