我想将函数f :: T
部分应用于值x :: [Double]
以获得结果函数f' :: forall a . Floating a => [a] -> a
。 T
应该是什么?我无法理解。
一个难点是,在f
内,我需要将x :: [Double]
与f'
的第一个参数(让我们称之为y
)通过一些数学结合起来(例如添加列表中的每个元素)。
我知道在内部,x
和y
都是Double
,因此我最终使用了f :: forall a . Floating a => [a] -> (forall b . Floating b => [b] -> b)
类型,并使用unsafeCoerce
(我知道,我知道......)只要f
类型的值与类型a
合并,就会在b
内。
对f
的更好类型的想法?
上下文:在部分应用forall a . Floating a => [a] -> a
后,我被迫生成更通用的f
类型,因为我需要使用Haskell自动存储库ad
获取结果函数的渐变。该库中的函数grad
要求其输入函数具有该常规类型。
(为什么我需要部分应用目标函数?你可以想象这样的函数会有内部常量,优化器不应将其作为更改状态向量的一部分来处理。黑客可能会处理常量作为状态的一部分,只是不更新常量,但在这种情况下,渐变的范数不会在局部最小值处变为零,其他事情可能会出错。)