gpt4 book ai didi

haskell - 模式重叠,为什么会发生?

转载 作者:行者123 更新时间:2023-12-02 20:48:50 25 4
gpt4 key购买 nike

我有一个文件 OptionList.hs,其新数据类型名为 OptionList。我想在显示 OptionList 时隐藏 EmptyOpt:

module OptionList (
OptionList,
voidOption,
(+:)
) where


data OptionList a b = EmptyOpt | OptionList { optListHead :: a, optListTail :: b } deriving (Read)

instance (Show a, Show b) => Show (OptionList a b) where
show (OptionList voidOption a) = "{" ++ (show a) ++"}"
show (OptionList a voidOption) = "{" ++ (show a) ++"}"
show (OptionList a b) = "{"++ (show a) ++ ", " ++ (show b) ++"}"
show voidOption = ""




voidOption::(OptionList Int Int)
voidOption = EmptyOpt



(+:) :: a -> b -> (OptionList a b)
infixr 5 +:
t1 +: t2 = OptionList t1 t2

然后我有主文件todo.hs

import OptionList


main = do
print ( 0 +: "test" +: voidOption )

但是编译器告诉 OptionList.hs 中的模式匹配是重叠的:

OptionList.hs:12:9: Warning:
Pattern match(es) are overlapped
In an equation for ‘show’:
show (OptionList a voidOption) = ...
show (OptionList a b) = ...

当我执行它时,它确实是重叠的。它产生以下输出:

{{}}

(我希望它是 {0, {"test"}})

但是为什么这些模式会重叠?

最佳答案

在行

show (OptionList voidOption a) = "{" ++ (show a) ++"}"

voidOption 是一个新的局部变量,就像 a 一样。它与下面定义的voidOption变量没有关系。本质上,上面的行相当于

show (OptionList b a) = "{" ++ (show a) ++"}"

因此,它总是与以下几行匹配并重叠。

如果我们将模式中的所有变量视为模式定义的变量,就很容易记住这一点。从某种意义上说,它们是“走出”模式的值(value)观,而不是“融入”模式。

打开警告 (-Wall) 应该会警告您此错误,因为 voidOption 的新本地绑定(bind)会遮蔽全局绑定(bind)。

在模式中,您应该使用 EmptyOpt 构造函数。例如

show (OptionList EmptyOpt a) = "{" ++ (show a) ++"}"

关于haskell - 模式重叠,为什么会发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41764189/

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