gpt4 book ai didi

haskell - 意外的模式匹配行为

转载 作者:行者123 更新时间:2023-12-04 22:21:14 25 4
gpt4 key购买 nike

这是我的代码的(简化版本):

data Exp = Var String

test :: Exp -> String -> Bool
test e vIn = case e of
Var vIn -> True
_ -> False

当我运行这个:
test (Var "X") "Y"

我得到 True,这很奇怪,因为它需要匹配 (Var vIn) 和 (Var s),s ~= vIn。

谁能解释发生了什么,并提出解决方法?

最佳答案

Haskell 不允许匹配模式中的变量,因为这需要这些变量的类型是 Eq 的实例。 .例如,这不起作用

isEqual :: Int -> Int -> Bool
isEqual a a = True
isEqual _ _ = False

它给出了错误:
Conflicting definitions for `a'
...
In an equation for `isEqual

如果 Haskell 不允许这样的事情,那为什么你的例子会编译呢?在您的代码中发生的是 vIn case 中的变量声明影响 vIn变量限制在测试方程中。如果您使用 -Wall 进行编译,编译器也会对此发出警告。旗帜:
code.hs:7:18: Warning:
This binding for `vIn' shadows the existing binding
bound at code.hs:6:8

这意味着有两个 vIn变量,它们不相等,只有内部的变量是可见的,因为它会遮挡外部的变量。

要修复代码,您必须明确地将函数参数与 vIn 进行比较。在这种情况下匹配的值:
data Exp = Var String

test :: Exp -> String -> Bool
test e x = case e of
Var vIn -> vIn == x -- Explicitly compare vIn to x
_ -> False

或者只是在 Var 上使用 guard 和模式匹配在 test等式,如果这是一个选项:
data Exp = Var String

test :: Exp -> String -> Bool
test (Var a) vIn
| a == vIn = ... {- Code for the case that vIn == a -}
| otherwise = False

关于haskell - 意外的模式匹配行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18805354/

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