Haskell 奇怪的模式匹配:正确吗?
为什么这个功能总是成功?它总是返回带有任何值和任何类型的Haskell 奇怪的模式匹配:正确吗?,haskell,pattern-matching,Haskell,Pattern Matching,为什么这个功能总是成功?它总是返回带有任何值和任何类型的True。这是正确的行为吗 f a b = case a of b -> True; _ -> False 案例定义中的b不是f定义头部的bin。您创建了一个新的局部作用域变量。因此,您的代码相当于: f a b = case a of c -> True _ -> False f a b = case a of _ -> True 除了被接受的完美答案,我的两分钱: 这: 这是:
True
。这是正确的行为吗
f a b = case a of b -> True; _ -> False
案例定义中的
b
不是f
定义头部的b
in。您创建了一个新的局部作用域变量。因此,您的代码相当于:
f a b = case a of
c -> True
_ -> False
f a b = case a of
_ -> True
除了被接受的完美答案,我的两分钱: 这: 这是:
f a b = case a of
c -> True
_ -> False --(B)
它们相当于:
f a b = case a of
c -> True
_ -> False
f a b = case a of
_ -> True
或
或
所以,要小心,因为这是您创建的真实行为,一个接受两个参数并始终返回True的函数
此外:
(A)和(B)如果使用了-Woverlapping patterns
,则将显示此警告:
warning: [-Woverlapping-patterns]
Pattern match is redundant
In a case alternative: _ -> ...
|
3 | _ -> False
| ^^^^^^^^^^
b->True
中的b
是一个局部作用域变量,在f
定义级别中“隐藏”外部b
。您使用的模式是b
,与变量的模式匹配总是成功的。@WillemVanOnsem这个问题本质上不是关于?你不认为它真的应该这样标记吗?所以,如果你已经回答了这个问题,你觉得在这种情况下,你有时也可以重新给他们贴标签,怎么样?在我做了这样的重新标记编辑之后,我真的很不安地看到我的名字一直在标签上……故事的寓意:别忘了添加-Wall
。OP:这是正确的行为吗?
你期望的是什么行为?你应该在这个问题上分享你的假设:)像往常一样棒极了,但现在我可以加上我的两分钱:)
f _ b = True
warning: [-Woverlapping-patterns]
Pattern match is redundant
In a case alternative: _ -> ...
|
3 | _ -> False
| ^^^^^^^^^^