You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:58:38