9

ここの全くの初心者、苦労しています。

セットの型クラスを定義しようとしています。この場合、「exists」の定義のみが必要になります。'exists'は、セットとセットアイテムの関数を取り、ブール値を返します。Haskellでそれをどのように定義できますか?

次は正しい方向でもありますか?したがって、型クラスの定義とリスト付きのsetの実装があり、「exists」は今のところtrueを返します。

-- Set.hs --

class Set a b where

  exists :: a -> (b -> Bool) -> Bool


-- ListSet.hs --

instance Set ListSet a where 

  exists a f = True

-

(結果:クラス `Set'のパラメーターが多すぎます)

4

2 に答える 2

13

十分な拡張機能を使用して、この方法でそれを行うことができます。少なくとも、複数パラメーター型のクラスが必要です。ただし、使用するのは非常に面倒です。あちこちで明示的な型アノテーションを指定する必要があります。これを修正する1つの方法は、機能従属性を導入することです(別の拡張機能を使用)。

class Set a b | a -> b where
    exists :: a -> (b -> Bool) -> Bool

これは、セットのタイプがわかれば、要素のタイプも知っていることを意味します。ただし、拡張機能なしで機能するより簡単な方法があります。

class Set f where
    exists :: f a -> (a -> Bool) -> Bool

ここで、型クラスはより種類の多い型に及びます。これは巧妙なトリックであり、これまでに見たことがない場合は自分で思いつくのは難しいです。

于 2012-07-16T16:59:48.557 に答える
7

ダニエル・ワーグナーは、あなたがやろうとしていることについて、すでに完璧な答えを出しました。私はあなたのエラーについてのポイントを追加したいだけです- Too many parameters for class 'Set'。これは、対応するGHC拡張機能を有効にしなかったことを意味します- MultiParamTypeClasses。ソースファイルの先頭に特別な種類のコメントを指定することで、これを行うことができます。

{-# LANGUAGE MultiParamTypeClasses #-}
--
-- Your source code here
--

そうすれば、コードをコンパイルできるはずです。

Danielの回答で言及されている別のHaskell機能も、特定の拡張を有効にする必要があります。つまり、 (これは型クラス宣言内FunctionalDependenciesの奇妙なことです)。.. | a -> b ..次のように、カンマを使用して複数の拡張機能を同時に有効にできます。

{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}

Carlのコメントは、別の拡張機能について言及していTypeFamiliesます。これは、実行しようとしていること(セットタイプの一般的なクラスまたは他の種類のコレクション)の手段も提供する可能性があります。あなたはここでそれについて読むことができます:http://www.haskell.org/haskellwiki/Type_families

于 2012-07-16T17:52:51.520 に答える