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

Haskell Parsec函数改写为GHCi单行代码报错原因求解

报错原因

GHCi针对两种定义方式的默认类型推断规则存在差异:

  • 逐行输入多行函数定义时,GHCi默认启用ExtendedDefaultRules扩展,会自动将多态的Parsec解析器类型特化为常用的具体类型,绕过了标准Haskell的约束检查规则,因此不会报错。
  • 用let单行绑定定义时,默认遵循Haskell2010标准的约束检查规则,该标准不允许约束中出现非类型变量的参数。你代码中parseDiv的推断类型包含Stream s m Char约束,其中Char是具体类型而非类型变量,不符合标准要求,因此触发报错。
修复方案
  • 方案一:先在GHCi中执行:set -XFlexibleContexts开启扩展,允许非类型变量出现在约束中,再运行你的单行let代码即可正常工作。
  • 方案二:给parseDiv添加明确的类型签名,避免GHCi推断出多态约束,示例代码如下:
let parseDiv :: Parsec String () Tag; parseDiv = do { string "<div>"; return $ MkTag "div" }
  • 方案三:继续使用:{、:}包裹多行定义,和你原本的编写逻辑一致,无需额外修改即可运行。

内容的提问来源于stack exchange,提问作者CarbonMan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 15:54:05