Haskell定义ADT后getArray函数因JArray类型构造器报错
问题原因与解决办法
嘿,这个问题其实是Haskell代数数据类型(ADT)里的一个常见小误区——数据构造器和类型名称是完全独立的两个东西!
咱们来拆解你的代码:
你定义的JValue里,JArray [JValue]这部分中,JArray是数据构造器(用来生成JValue实例的“工厂”),它实际包裹的类型是[JValue](也就是JValue的列表)。但你在getArray的类型签名里写了Maybe JArray,这就犯了一个错误:JArray不是一个类型,编译器找不到名为JArray的类型构造器,所以才会抛出那个错误。
对比一下你其他正常工作的函数就能明白:
getString返回Maybe String,String是合法的类型;getInt返回Maybe Int,Int是合法的类型;getObject返回Maybe [(String, JValue)],这正是JObject构造器包裹的类型。
所以getArray的正确类型签名应该返回Maybe [JValue],而不是Maybe JArray。修正后的代码如下:
getArray :: JValue -> Maybe [JValue] getArray (JArray arr) = Just arr getArray _ = Nothing
另外,编译器提示里的“did you mean DataKinds?”是个干扰项——DataKinds扩展可以把数据构造器提升为类型,但你完全不需要启用这个扩展,只是单纯写错了类型签名而已。
内容的提问来源于stack exchange,提问作者Bercovici Adrian
相关产品推荐
相关产品推荐

