Haskell实现Dijkstra算法出现MArray约束编译错误如何解决?
问题解决方法
你遇到的编译报错是GHC的标准语法限制导致的,直接按下面步骤操作即可修复:
- 首先在你的
.hs源文件的最顶部添加如下语言扩展声明:{-# LANGUAGE FlexibleContexts #-} - 如果后续编译还提示其他扩展缺失,可以根据报错提示按需添加,ST+可变数组相关代码常用的扩展还有
ScopedTypeVariables、RankNTypes,多个扩展之间用逗号分隔即可:{-# LANGUAGE FlexibleContexts, ScopedTypeVariables, RankNTypes #-} - 重新编译代码,该报错就会消失。
报错原因说明
标准Haskell的类型系统默认不允许类型类约束中出现非裸类型变量的复合类型参数,你代码里推断出的约束MArray (STArray s) e0 m中,STArray s是带参数的类型构造器,不符合默认语法规则。FlexibleContexts是GHC专门提供的扩展,用来放开这个限制,是处理可变数组、Monad相关高阶代码时非常常用的安全扩展,不会引入额外风险。
内容的提问来源于stack exchange,提问作者Danish A. Alvi
相关产品推荐
相关产品推荐

