Haskell中MonadState对String/List使用modify/put时报错如何解决
问题原因
这是Haskell98标准的类型类约束语法限制导致的:默认情况下,类型类的参数必须是无任何构造的裸类型变量,不能是具体类型、或是应用了类型构造器的类型。
你最开始的示例函数f可以正常运行,是因为MonadState s m中的第一个参数是裸类型变量s,仅通过额外的Num s约束限制类型范围,符合默认语法要求。而你编写MonadState Char m、MonadState [a] m这类约束时,第一个参数分别是具体类型Char和应用了列表构造器的[a],不符合默认规则,因此触发报错。
解决方法
直接启用GHC的FlexibleContexts扩展即可,这是Haskell开发中非常常用的安全扩展,仅放宽语法限制,不会改变代码运行逻辑,无额外副作用:
- 若在.hs源文件中编写代码,在文件顶部添加如下编译指令:
{-# LANGUAGE FlexibleContexts #-} - 若在GHCi交互环境中测试,直接输入以下命令开启:
:set -XFlexibleContexts
开启扩展后,你现有的代码无需修改逻辑即可正常编译运行。
内容的提问来源于stack exchange,提问作者lukas kiss
相关产品推荐
相关产品推荐

