只是盯着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)
使用
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 3
是4
.如果稍后添加定义,则不会更改此内容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)
我不是这种方法的粉丝,因为我发现标准模式与警卫更清晰.
归档时间: |
|
查看次数: |
112 次 |
最近记录: |