我知道問“為什么我的代碼不起作用”并不是最好的問題。但是,我提出這個問題是因為我希望在圖論問題的演算法背景關系中了解更多關于在 Haskell 中使用 monad 的資訊,并以以下代碼為起點,了解如何在此類演算法中使用 ST monad。
我在一些更簡單的演算法(快速排序)上取得了進展,并進入了 Dijkstra 演算法。我無法編譯 Dijkstra 演算法的以下實作(2012 年撰寫):http : //www.rosettacode.org/wiki/Dijkstra's_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 中所知道的一切(包括適當的縮進),但沒有成功。
uj5u.com熱心網友回復:
正如錯誤所說,該演算法使用FlexibleContexts擴展名 [haskell.org]。通常只形式的約束C t,或者,可以使用與一個型別類和,和型別的變數。通過啟用,約束還可以使用型別建構式。C (q t1 t2 … tn)CqttiFlexibleContexts
編譯器檢測到型別約束(MArray (STArray s) e0 m, MArray (STArray s) v m)用作背景關系,因此STArray用作型別建構式,這是不允許的。編譯器檢測到這一點并引發一個錯誤,其中提到:
(Use FlexibleContexts to permit this)
因此,編譯器就可能解決問題的方法提供建議,盡管我同意這有點“神秘”。
因此,您可以使用檔案頭部的語言編譯指示啟用此功能:
{-# LANGUAGE FlexibleContexts #-}
--- rest of the file ?
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316862.html
