Haskell 如何处理“;推断类型的多态性比预期的少”;?

Haskell 如何处理“;推断类型的多态性比预期的少”;?,haskell,types,numerical,fad,Haskell,Types,Numerical,Fad,我需要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.

我需要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
如果我写

bigNumber :: (Num a) => a
bigNumber = product [1..100]
然后当计算
bigNumber::Int
时,
它正在评估
(产品::[Int]->Int)[(1::Int)…(100::Int)]

当计算
bigNumber::Integer
时,
它正在评估
(产品::[Integer]->Integer)[(1::Integer)…(100::Integer)]

两者之间没有任何共享

error\u diff
只有一种类型,即:
[Double]->NetworkState[(Int,Int,Double)]
。它必须以一种精确的方式进行评估

但是,您的内部:

... :: NetworkState ([FAD.Dual tag Double] -> FAD.Dual tag Double)
可以以不同的方式进行评估,具体取决于
tag
是什么


看到问题了吗?

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

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
,这与键入嵌套表达式时不同,嵌套表达式本身无法重复使用。

不,抱歉。我不知道标记类型变量有什么用途。我该如何处理Numeric.FAD?我所需要的只是推导。有关FAD使用的“标记”的讨论,请参阅。我没有安装Numeric.FAD,因此我还不能自信地帮助您重新构建代码。也许你可以自己试一试,从那篇文章中得到一些提示?
test :: Int
test =
  res
  where
    res :: Num a => a
    res = 5