0

この質問は、Haskell can't deduce type equalityという質問のフォローアップです。次のコードを使用して、前の質問で説明したTrainable型を使用して、基本的な多項式近似器を実装しようとしました:

module MachineLearning.Polynomial
       (polynomial,
        polynomialTrf
       ) where
import MachineLearning.Training
import MachineLearning.Utils

polynomialTrf :: Floating n => [n] -> n -> n
polynomialTrf coeff var = helper 0 coeff var 0 where
  helper _ [] var acc = acc
  helper 0 (c:cs) var acc = helper 1 cs var c 
  helper deg (c:cs) var acc = helper (deg+1) cs var (acc+(c*(var^deg)))

polynomialCost :: Floating n => n -> n -> [n] -> n
polynomialCost var target coeff = sqcost (polynomialTrf coeff var) target

polynomialSV :: (Floating n) => Trainable n n
polynomialSV = Trainable polynomialTrf polynomialCost

これsqcostはちょうどsqcost a b = (a-b) ^ 2です。コンパイラから次のエラー メッセージが表示されます。

src/MachineLearning/Polynomial.hs:18:26:
    Could not deduce (n1 ~ n)
    from the context (Floating n)
      bound by the type signature for
                 polynomialSV :: Floating n => Trainable n n
      at src/MachineLearning/Polynomial.hs:18:1-53
    or from (Floating n1)
      bound by a type expected by the context:
                 Floating n1 => [n1] -> n -> n
      at src/MachineLearning/Polynomial.hs:18:16-53
      `n1' is a rigid type variable bound by
           a type expected by the context: Floating n1 => [n1] -> n -> n
           at src/MachineLearning/Polynomial.hs:18:16
      `n' is a rigid type variable bound by
          the type signature for polynomialSV :: Floating n => Trainable n n
          at src/MachineLearning/Polynomial.hs:18:1
    Expected type: [n] -> n1 -> n1
      Actual type: [n] -> n -> n
    In the first argument of `Trainable', namely `polynomialTrf'
    In the expression: Trainable polynomialTrf polynomialCost

src/MachineLearning/Polynomial.hs:18:40:
    Could not deduce (n ~ n1)
    from the context (Floating n)
      bound by the type signature for
                 polynomialSV :: Floating n => Trainable n n
      at src/MachineLearning/Polynomial.hs:18:1-53
    or from (Floating n1)
      bound by a type expected by the context:
                 Floating n1 => n -> n -> [n1] -> n1
      at src/MachineLearning/Polynomial.hs:18:16-53
      `n' is a rigid type variable bound by
          the type signature for polynomialSV :: Floating n => Trainable n n
          at src/MachineLearning/Polynomial.hs:18:1
      `n1' is a rigid type variable bound by
           a type expected by the context: Floating n1 => n -> n -> [n1] -> n1
           at src/MachineLearning/Polynomial.hs:18:16
    Expected type: n -> n -> [n1] -> n1
      Actual type: n -> n -> [n] -> n
    In the second argument of `Trainable', namely `polynomialCost'
    In the expression: Trainable polynomialTrf polynomialCost

私の質問は、問題はどこから来ているのですか? どうすれば解決できますか?私にとっては、これら 2 つの型が等しいことは明らかなので、型システムで何かを誤解している可能性があります。

4

1 に答える 1

2

恐るべしランク2タイプ

data Trainable a b
    = Trainable (forall n. Floating n => [n] -> a -> b)
                (forall n. Floating n => a -> b -> [n] -> n)

あなたを助けません。私は他の質問の型エラーのみに集中しましたがFloating、実際に使用できるほど豊富ではないことに気づきませんでした。Floatingある型から別の型へ、またはs ( )Floating以外の型への一般的な変換はできないため、与えられたポリモーフィック型の多くの興味深い関数を一般的に書くことはできません。申し訳ありません。RealrealToFrac

ここでの問題は、上記の型では、Trainableコンストラクターに渡される関数がすべてのFloatingn(指定されたaおよびb) に対して機能することを要求しますが、実装polynomialTrfおよびは、(両方の) パラメーターとして指定されたpolynomialCost特定の型に対してのみ機能することです。には typeがありますが、コンストラクターに渡すのに適した型にする必要があります。FloatingpolynomialTrfFloating n => [n] -> n -> n(Floating n, Floating f) => [f] -> n -> nTrainable

3 番目の型パラメーターを使用すると、次のようになります。

Trainable polynomialTrf polynomialCost :: Floating n => Trainable n n n

trainSgdFull場合、タイプが必要になります

trainSgdFull :: (Floating n, Ord n, Mode s) => Trainable a b (AD s n) -> [n] -> a -> b -> [[n]]

使用できるようにgradientDescent

あなたの問題に対する適切な解決策がどのように見えるかわかりません。

于 2013-02-06T22:10:21.003 に答える