私は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をモデル化するより良い方法を指摘できれば、私は喜んでそれを試してみましょう!
「h」は何ですか? 'a'が' h'を決定する場合は、型のファミリーや関数の依存関係を扱うことができますが、それは初心者にお勧めするトピックではありません。 – epsilonhalbe
[rigid type variable error](https://stackoverflow.com/questions/4629883/rigid-type-variable-error)の重複している可能性があります – jberryman
「* aはh *型の仮説セットをカプセル化します」とはどういう意味ですか? – Bergi