この質問は、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 つの型が等しいことは明らかなので、型システムで何かを誤解している可能性があります。