1

私は機械学習の本に沿って進めようとしており、コードを一般化できるようにしようとしている将来のコンテンツについて少し知っています。

これが私のコードです。最終的には DataSet の他のインスタンスを作成する予定ですが、現時点ではこれだけです。

data SupervisedDataSet x y = SupervisedDataSet [([x], y)] deriving (Show)       

class DataSet a where                                                           
 augment :: x -> a -> a --Augment each input vector, making x the head.                                                       

instance DataSet (SupervisedDataSet x y) where                                   
  augment v (SupervisedDataSet ds) =·                                           
    let xsys = unzip ds in                                                      
      SupervisedDataSet $ zip (map (v:) $ fst xsys) (snd xsys)  

GHC の型チェッカーによって要求されたようにSupervisedDataSet、 の最初のパラメーターで の最初のパラメーターの型を強制しようとしています。augment

Perceptron.hs:16:7:
  Couldn't match type `x1' with `x'
    `x1' is a rigid type variable bound by
         the type signature for
           agument :: x1 -> SupervisedDataSet x y -> SupervisedDataSet x y
         at Perceptron.hs:14:3
    `x' is a rigid type variable bound by
        the instance declaration at Perceptron.hs:13:37
  Expected type: SupervisedDataSet x1 y
    Actual type: SupervisedDataSet x y
  In the expression:
    SupervisedDataSet $ zip (map (v :) $ fst xsys) (snd xsys)
  In the expression:
    let xsys = unzip ds
    in SupervisedDataSet $ zip (map (v :) $ fst xsys) (snd xsys)

エラーが発生する理由は理解していますが、修正方法がわかりません。どんなアイデアでも大歓迎です。ありがとう

御時間ありがとうございます。

4

1 に答える 1

2
class DataSet a where
  augment :: x -> a -> a

次のように書くことができます

class DataSet a where
  augment :: forall x . x -> a -> a

代わりに試す

data SupervisedDataSet x y = SupervisedDataSet [([x], y)] deriving (Show) 

class DataSet f where
  augment :: a -> f a b -> f a b

instance DataSet SupervisedDataSet where
  augment v (SupervisedDataSet ds) =
    let xsys = unzip ds in
      SupervisedDataSet $ zip (map (v:) $ fst xsys) (snd xsys)
于 2013-04-05T03:24:25.863 に答える