data Player = User | COM deriving Eq
data Spot = JustA Player | None deriving Eq
instance Show Player where
show User = "X"
show COM = "O"
instance Show Spot where
show None = " "
字符串
在上面的代码中,我创建了两种数据类型,Player
和Spot
,这是Just Player
或None
。现在我可以show JustA User
来给予结果“X”,但这不起作用。我尝试了各种方法来使用示例,但它们对我不起作用。
给出的错误是:
ghci> tictactoe
The computer will go first as O
| |
---+---+---
*** Exception: tictactoe.hs:11:5-19: Non-exhaustive patterns in function show
型
(当尝试show JustA COM
时出现错误)
1条答案
按热度按时间idv4meu81#
问题不止一个
非穷举模式
错误消息
Non-exhaustive patterns in function show
告诉您有一个尚未处理的案例。GHC可以告诉你,在编译时(或在GHCi中加载时),如果你打开不完整模式标志:
字符串
这样,你不仅会收到GHCi的警告,还会告诉你问题在哪里:
型
不过,通常情况下,只打开包括
incomplete-patterns
:Wall在内的更广泛的标志集会更容易。要解决这个问题,请将缺少的case添加到
Spot
的show
示例中:型
尽管如此,让编译器派生
show
示例更容易:型
当然,这不会给你给予完全相同的输出。使用这种替代方法,
show User
将返回User
而不是X
。然而,这被认为是惯用的。安装
另一个问题可能与表达式
show JustA User
有关。如果你在GHCi中尝试它,它会给予你一个详细的错误消息:型
函数
show
需要一个 * 单一 * 输入值,但由于Haskell的语法,像show JustA User
这样的表达式在Haskell编译器看来就像是一个有两个参数的函数调用。你至少可以通过两种方式来解决这个问题:
型
这两种方法使用不同的语法,但它们是等价的。使用哪一种是你的偏好问题。