我想将一个函数部分应用于f :: T
一个值x :: [Double]
以获得结果函数f' :: forall a . Floating a => [a] -> a
。应该T
是什么?我想不通。
一个困难是,在内部f
,我需要通过一些数学运算(例如添加列表的每个元素)与(我们称之为)x :: [Double]
的第一个参数相结合。f'
y
我在内部知道这一点,x
并且y
两者都是Double
s,所以我最终使用 type f :: forall a . Floating a => [a] -> (forall b . Floating b => [b] -> b)
,并且每当 type 的值与 type组合时unsafeCoerce
在内部使用(我知道,我知道......)。f
a
b
对更好的类型有任何想法f
吗?
forall a . Floating a => [a] -> a
上下文:在部分应用后,我被迫生成更通用的类型,f
因为我需要使用 Haskell autodiff library 获取结果函数的梯度ad
。该grad
库中的函数要求其输入函数具有该通用类型。
(为什么我需要部分应用目标函数?您可以想象这样的函数将具有内部常量,优化器不应将其视为变化状态向量的一部分。黑客可能是将常量视为状态,只是不更新常数,但在这种情况下,梯度的范数不会在局部最小值处变为零,其他事情可能会出错。)