私が作成したデータ型に対してインスタンス宣言を行う際にタイプコンテキストを使用しました。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)
はだから今、私は私はそうのように、私のセットタイプを使用して定義するか、私は型エラーを取得する機能のすべてに、式のタイプのコンテキストを追加する必要があります。
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」と上必要である理由を私は理解していないということである「サブセット」私がそれらを削除すると、コンパイルされません。あなたのインスタンス宣言が言う
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
あなたのコードは私のためにタイプチェックを行います。あなたは何を外していますか? – bdonlan
私はスコープや名前に関係するかなり微妙なエラーがあると思っています。 –
私の質問は不明でした。コードがコンパイルされます。私は "メンバーセット"と "サブセット"の型のコンテキストでコンパイルできないのだろうかと思っています。 –