我在爲我組成的數據類型做實例聲明時使用了一個類型上下文。函數上需要實例聲明的Haskell類型上下文
data Set a = Insert a (Set a) | EmptySet
instance (Show a) => Show (Set a) where
show x = "{" ++ show' x ++ "}" where
show' (Insert x EmptySet) = show x
show' (Insert x xs) = show x ++ ", " ++ show' xs
instance Eq a => Eq (Set a) where
(Insert x xs) == (Insert y ys) = (x == y) && (xs == ys)
所以,現在,我要的EQ類型的上下文添加到所有的我定義使用我的設置類型,像這樣的功能,或者我得到一個錯誤類型:
memberSet::Eq a =>a->Set a->Bool
memberSet _ EmptySet = False
memberSet x (Insert y ys)
| x == y = True
| otherwise = memberSet x ys
subSet::Eq a=>Set a->Set a->Bool
subSet EmptySet _ = True
subSet (Insert a as) bs
| memberSet a bs = subSet as bs
| otherwise = False
錯誤我看起來像:
No instance for (Eq a)
arising from a use of `=='
In the expression: (x == y)
In a stmt of a pattern guard for
an equation for `memberSet':
(x == y)
In an equation for `memberSet':
memberSet x (Insert y ys)
| (x == y) = True
| otherwise = memberSet x ys
Failed, modules loaded: none.
這是什麼意思?爲什麼我會得到這個錯誤?我想,一旦我做了實例聲明,Haskell就能夠自動驗證在我的函數「memberSet」和「subSet」中被「==」比較的東西是否會自動被檢查爲「Eq?」的實例。
編輯爲清楚:
我的問題是,我不明白爲什麼類型的上下文是在「成員集」的和必要的「子集」。如果我像這樣刪除它,它不會編譯。
memberSet::a->Set a->Bool
memberSet _ EmptySet = False
memberSet x (Insert y ys)
| x == y = True
| otherwise = memberSet x ys
subSet::Set a->Set a->Bool
subSet EmptySet _ = True
subSet (Insert a as) bs
| memberSet a bs = subSet as bs
| otherwise = False
你給我typechecks的代碼。你要離開什麼? – bdonlan 2011-12-17 23:33:45
我懷疑涉及範圍或名稱的某種相當微妙的錯誤,因爲給出的代碼似乎很好。 – 2011-12-17 23:36:40
我的問題還不清楚。代碼是編譯。我想知道爲什麼它不能用編輯的「memberset」和「subset」類型上下文進行編譯。 – 2011-12-17 23:37:36