【发布时间】:2021-11-24 15:20:00
【问题描述】:
我知道问“为什么我的代码不起作用”并不是最好的问题。但是,我想了解更多关于在图论问题的算法上下文中在 Haskell 中使用 monad 的信息,并以以下代码为起点来了解 ST monad 将如何用于此类算法。
我在一些更简单的算法(快速排序)上取得了进展,并进入了 Dijkstra 算法。我无法编译 Dijkstra 算法的以下实现(2012 年编写):http://www.rosettacode.org/wiki/Dijkstra%27s_algorithm#Haskell
我得到的错误如下:
• Non type-variable argument
in the constraint: MArray (STArray s) e0 m
(Use FlexibleContexts to permit this)
• When checking the inferred type
f :: forall (m :: * -> *).
(MArray (STArray s) e0 m, MArray (STArray s) v m) =>
Set (a0, v) -> (v, a0) -> m (Set (a0, v))
In the expression:
let
edges = adj_list ! u
f vertex_queue (v, weight) = do ...
in foldM f vertex_queue' edges >>= aux
In a case alternative:
Just ((dist, u), vertex_queue')
-> let
edges = adj_list ! u
f vertex_queue (v, weight) = ...
in foldM f vertex_queue' edges >>= aux
|
18 | f vertex_queue (v, weight) = do
(PS:这不是学校作业,这只是自我激励),我已经尝试了我在 Haskell 中所知道的一切(包括正确的缩进),但没有成功。
【问题讨论】:
-
可以分享你写的程序吗?现在我们只能看到错误。
-
如前所述,代码不是我自己写的。我已经分享了我问题中代码的链接。如果你说,我也可以分享链接中的代码。
-
如果将
{-# LANGUAGE FlexibleContexts #-}添加到文件顶部会怎样? -
哇,成功了!我知道语言扩展,但我无法破译“使用灵活上下文”是添加扩展的指令。我会记住这一点以备不时之需。我非常感谢威廉,我一直坚持这个周末。
-
也许“使用
FlexibleContext扩展”会是一个更好的错误信息。
标签: haskell compiler-errors monads ghc st-monad