Haskell调用NP类型值报错No instance for (Show NP)求助
自定义Haskell数据类型无法打印的原因及解决办法
错误原因
你遇到的No instance for (Show NP)错误,本质是:
- 在GHCi中直接输入变量名(比如
np)时,系统会调用print函数输出它,而print要求变量的类型必须属于Show类型类——这个类的作用是把值转换成人类可读的字符串格式。 - 你定义的所有自定义数据类型(
S、N、NP、ADJ等),默认都没有自动生成Show实例。Haskell不会主动为自定义类型添加这个实例,必须由开发者显式声明。
解决方法
在每个data类型声明的末尾加上deriving (Show),让Haskell自动为这些类型生成符合预期的Show实例。修改后的完整代码如下:
data S = S NP VP deriving (Show) data N = Linguist | Chemist | Anglist | N ADJ N deriving (Show) data NP = NP DET N deriving (Show) data ADJ = Curious | Smart deriving (Show) data DET = The | Some | Every deriving (Show) data VP = Snores | Dreams | V NP deriving (Show) data V = Cites | Corrects deriving (Show) np :: NP np = NP Every (N Smart (N Curious Linguist))
测试效果
重新加载代码后,在GHCi中调用np,就能得到你期望的输出:
NP Every (N Smart (N Curious Linguist))
大概率你的PPT示例省略了deriving (Show)的声明,这是新手容易忽略的细节——很多教学材料会默认读者知道这个必要步骤。
内容的提问来源于stack exchange,提问作者Kali
相关产品推荐
相关产品推荐

