2009-06-11 8 views
4

私はNumeric.FADライブラリが必要ですが、それでも存在するタイプに完全に困惑しています。「推測される型は予想よりも多型性が低い」とは何ですか?

これはコードです:

error_diffs :: [Double] -> NetworkState [(Int, Int, Double)] 
error_diffs desired_outputs = do diff_error <- (diff_op $ error' $ map FAD.lift desired_outputs)::(NetworkState ([FAD.Dual tag Double] -> FAD.Dual tag Double)) 
           weights <- link_weights 
           let diffs = FAD.grad (diff_error::([FAD.Dual tag a] -> FAD.Dual tag b)) weights 

           links <- link_list 
           return $ zipWith (\link diff -> 
                 (linkFrom link, linkTo link, diff) 
               ) links diffs 

エラーが」今度は現在NetworkStateを取るために無名関数を生成diff_opで走っリーダーモナドと、FAD.gradと詰め込むからの差動入力で動作しますそれらをリーダーに追加します。

ハスケル以下で私を混乱させる:

Inferred type is less polymorphic than expected 
    Quantified type variable `tag' is mentioned in the environment: 
    diff_error :: [FAD.Dual tag Double] -> FAD.Dual tag Double 
     (bound at Operations.hs:100:33) 
In the first argument of `FAD.grad', namely 
    `(diff_error :: [FAD.Dual tag a] -> FAD.Dual tag b)' 
In the expression: 
    FAD.grad (diff_error :: [FAD.Dual tag a] -> FAD.Dual tag b) weights 
In the definition of `diffs': 
    diffs = FAD.grad 
       (diff_error :: [FAD.Dual tag a] -> FAD.Dual tag b) weights 

答えて

3

私が書く場合は、

bigNumber :: (Num a) => a 
bigNumber = product [1..100] 

を、その後bigNumber :: Intが評価されたときに、
bigNumber :: Integerが評価されるとき、それは(product :: [Int] -> Int) [(1 :: Int) .. (100 :: Int)]

を評価しています、
評価するのは(product :: [Integer] -> Integer) [(1 :: Integer) .. (100 :: Integer)]です。

この2つの間で何も共有されていません。

error_diffsは、[Double] -> NetworkState [(Int, Int, Double)]です。それはちょうど1つの方法で評価する必要があります。

しかし、あなたは内部の持っているもの:

... :: NetworkState ([FAD.Dual tag Double] -> FAD.Dual tag Double) 

tagが何であるかに応じて、さまざまな方法で評価することができます。

を参照してください。

test :: Int 
test = 
    (res :: Num a => a) 
    where 
    res = 5 

コンパイラはresがタイプIntで常にであり、いくつかの理由のためにあなたがresが多型であると考えることを気にされていることを考え出し:

+1

いいえ、申し訳ありません。私はタグ型変数の目的が何であるか分かりません。 Numeric.FADをどうやって処理するのですか?私が必要とするのは派生です。 – Astro

+0

FADが使用する「タグ付け」については、http://thread.gmane.org/gmane.comp.lang.haskell.cafe/22308/を参照してください。私はNumeric.FADをインストールしていないので、あなたのコードをかなり再構築するのに自信を持って手伝ってくれません。おそらく、その記事のヒントとともに、自分自身で試してみることができますか? – ephemient

4

このコードは、あなたが得るのと同じエラーになります。

このコードは、正常に動作しますが、:

ここにも
test :: Int 
test = 
    res 
    where 
    res :: Num a => a 
    res = 5 

resは、多型として定義されていますが、しかIntとして使用します。コンパイラはネストされた式をこのように入力するときだけ気になります。この場合はresを再利用することができます。ネストされた式を入力するのとは対照的に、それらの用途の1つではIntとして使用されないことがありますが、それ自体は再利用できません。

関連する問題