嘗試創建IntegerGraph的實體時,我似乎收到一條錯誤訊息。我不明白錯誤資訊。有小費嗎?這是代碼:
import Data.Map (Map)
import qualified Data.Map as Map
import Data.Set (Set)
import qualified Data.Set as Set
class IntGraph g where
emptyG :: g
... (more constructors)
type MyGraph n = (Map n (Set n))
instance IntGraph MyGraph where
錯誤資訊:
? 'MyGraph' 需要一個引數 需要一個型別,但 'MyGraph' 有種類 '* -> *'
? 在'IntGraph' 的第一個引數中,即'MyGraph' 在'IntGraph MyGraph 的實體宣告中
uj5u.com熱心網友回復:
在 Haskell 中,就像術語級別的運算式有型別一樣,型別級別的運算式也有“種類”。具有 kind *、 like Bool、Int、Maybe [Char]和的型別運算式表示具有MyGraph Char該型別關聯值的型別。例如,您可以構造一個MyGraph Char, like Map.fromList [('a', Set.fromList ['b','c'])] :: MyGraph Char,這就是我們知道MyGraph Charmust be of kind 的方式*。
相反,具有 kind * -> *、 likeMyGraph且Maybe沒有關聯值的型別級運算式。Maybe例如,沒有 type 的值。相反,這些型別級別的運算式必須首先“應用”到一種 kind*以生成另一個 kind 的型別級別運算式*,表示可以具有值的型別。例如,如果我們將 kind 應用于Maybekind的型別* -> *,我們會得到一個新的 kind 型別。[Char]*Maybe [Char]*
如果這對您來說是全新的,您可能會發現我的這個舊的計算機科學堆疊交換答案很有幫助。
無論如何,您的型別類IntGraph只能在是 kind 的型別運算式IntGraph g時才有實體。我們可以說是這種情況,因為您的定義包括一個回傳 type 值的方法,這意味著它必須是 kind ,表示具有值的型別的型別運算式的種類。g*class IntGraph gemptyGgg*
當您嘗試定義一個實體時,您正在嘗試為kindinstance IntGraph MyGraph型別運算式定義一個實體,而 GHC 不喜歡這樣。它告訴您,在運算式中,它期望是一個“型別”(從技術上講,是 kind 的型別運算式),但它卻發現是 kind 。MyGraph* -> *instance IntGraph MyGraphMyGraph*MyGraph* -> *
MyGraph您可以通過為特定s定義實體來解決此問題:
instance IntGraph (MyGraph Char) where
或所有可能的 s 的單個實體MyGraph a,但您確實需要a在實體宣告中包含該型別變數,如下所示:
instance IntGraph (MyGraph a) where
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/528542.html
標籤:哈斯克尔图形实例
上一篇:訪問sum型別變體中的公共欄位
