2017-11-03 12 views
2

私はHaskellを開始しています。私は次のコードがうまくいかない理由をあなたの助けと直感にしたいと思います。主なアイデアは、私が`h 'と` String'を一致させることができません

data BoxSet = BoxSet { ids::[String], items::[(String,Int)]} deriving(Show) 

を定義し、ボックスセットに

のようなインスタンスを作ることができ、たとえばので、それは、一般的であるためにはアイデアがある確率質量関数を表すクラス

--a encapsulates a set of hypotheses of type h 
class Pmf a where 
    hypos :: a -> [h] 
    prob :: a -> h -> Double 
    probList :: a -> [(h,Double)] 

    probList a = map (\h->(h, prob a h)) $ hypos a 

を行うことです

instance Pmf BoxSet where 
    hypos = ids 

    prob cj _ = let one = 1 
        len = doubleLength $ ids cj in one/len 

が、これは次のエラーを与える

<interactive>:2:13: error: 
* Couldn't match type `h' with `String' 
    `h' is a rigid type variable bound by 
    the type signature for: 
     hypos :: forall h. BoxSet -> [h] 
    at <interactive>:2:5 
    Expected type: BoxSet -> [h] 
    Actual type: BoxSet -> [String] 
* In the expression: ids 
    In an equation for `hypos': hypos = ids 
    In the instance declaration for `Pmf BoxSet' 
* Relevant bindings include hypos :: BoxSet -> [h] (bound at <interactive>:2:5) 

追加のクラス・パラメータとして時間を置くことが、その後、将来的に、私はデータのための新しいタイプdでクラスを拡大していきますし、私はその後、this problem

を持つことになります。その可能性あなたはなぜ私に言うことができれば、私は感謝文字列をhと一致させることはできません。どのように解決できますか?私はそれがどんなタイプでもhを期待していることを理解していますが、インスタンスには特定のタイプを与えるのが理にかなっています。

また、私は完全に機能的な考え方ではないかもしれないと思う。ですから、これらのPmfをモデル化するより良い方法を指摘できれば、私は喜んでそれを試してみましょう!

+2

「h」は何ですか? 'a'が' h'を決定する場合は、型のファミリーや関数の依存関係を扱うことができますが、それは初心者にお勧めするトピックではありません。 – epsilonhalbe

+0

[rigid type variable error](https://stackoverflow.com/questions/4629883/rigid-type-variable-error)の重複している可能性があります – jberryman

+0

「* aはh *型の仮説セットをカプセル化します」とはどういう意味ですか? – Bergi

答えて

3

この

class Pmf a where 
    hypos :: a -> [h] 
    prob :: a -> h -> Double 

は、2人の署名でh sは無関係であり、さらにこれらの機能のそれぞれは、任意hそのために働く必要がある

class Pmf a where 
    hypos :: forall h. a -> [h] 
    prob :: forall h. a -> h -> Double 

ための短いです発信者はを選択します。私は、私は、それぞれに必要な拡張の一握りがあります

class Pmf a h | a -> h where 
    hypos :: a -> [h] 
    ... 

instance Pmf BoxSet String where 
    ... 

あなたが事の同じ種類を行うのいずれかのタイプの家族

class Pmf a where 
    type Hypothesis a :: * 
    hypos :: a -> [Hypothesis a] 
    ... 

instance Pmf BoxSet where 
    type Hypothesis BoxSet = String 
    ... 

または機能従属関係、探していると思いますが、異なる闊歩してエラーメッセージが先に進むと思います。

関連する問題