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

error' 在 Reader monad 中运行,由 diff_op 运行,然后生成一个匿名函数来获取当前的 NetworkState 和来自 FAD.grad 的差分输入,并将它们填充到 Reader 中。

Haskell 让我对以下内容感到困惑:

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
4

2 回答 2

4

此代码给出了与您得到的相同的错误:

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

编译器认为它res始终是类型Int,并且由于某种原因您认为res它是多态的而感到困扰。

但是,此代码可以正常工作:

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

在这里,也res被定义为多态,但仅用作Int. 只有当您以这种方式键入嵌套表达式时,编译器才会受到困扰。在这种情况下res可以重用,也许其中一种用途不会将其用作Int,这与您键入嵌套表达式时相反,它本身不能重用。

于 2009-06-11T22:59:31.520 回答
3

如果我写,

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

然后当bigNumber :: Int被评估时,
它正在评估(product :: [Int] -> Int) [(1 :: Int) .. (100 :: Int)]

bigNumber :: Integer被评估时,
它正在评估(product :: [Integer] -> Integer) [(1 :: Integer) .. (100 :: Integer)]

两者之间没有任何共享。

error_diffs有一个类型,即:[Double] -> NetworkState [(Int, Int, Double)]. 它必须以一种方式进行评估。

但是,你里面有什么:

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

可以用不同的方式进行评估,具体取决于是什么tag

看到问题了吗?

于 2009-06-11T22:45:02.973 回答