我需要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
答案 0 :(得分: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
,与您键入嵌套表达式相反,后者无法自行重复使用。
答案 1 :(得分: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
是什么。
看到问题?