gpt4 book ai didi

haskell - 模式匹配的变量值

转载 作者:行者123 更新时间:2023-12-03 14:26:31 24 4
gpt4 key购买 nike

只是盯着 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

最佳答案

采用

a = "foo"
b = "bar"

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

或者
g "foo" = a
g "bar" = a

当您使用变量进行模式匹配时
g a = ...

变量 a是一个局部变量,绑定(bind)到函数的参数。即使 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) = ...

不过,我不喜欢这种方法,因为我发现带有 guard 的标准模式更清晰。

关于haskell - 模式匹配的变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23754460/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com