【问题标题】:Not being able spot the problem in the code in Dijkstra’s Haskell implementation在 Dijkstra 的 Haskell 实现中无法发现代码中的问题
【发布时间】: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


【解决方案1】:

正如错误所说,该算法使用了FlexibleContexts extension [haskell.org]。通常只能使用 C tC (q t<sub>1</sub> t<sub>2</sub> … t<sub>n</sub>) 形式的约束,C 是类型类,qtt<sub>i</sub> 类型变量。通过启用FlexibleContexts,约束也可以使用类型构造函数。

编译器检测到类型约束使用(MArray (STArray s) e0 m, MArray (STArray s) v m)作为上下文,所以使用STArray作为类型构造函数,这是不允许的。编译器检测到这一点并引发错误提示:

(Use FlexibleContexts to permit this)

因此,编译器会给出可以解决问题的建议,尽管我同意它有点“神秘”。

因此,您可以使用文件头部的语言编译指示启用此功能:

{-# LANGUAGE FlexibleContexts #-}

--- rest of the file &vellip;

【讨论】:

    猜你喜欢
    • 2021-04-21
    • 2012-11-25
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 2015-02-05
    • 1970-01-01
    相关资源
    最近更新 更多