如何部分应用函数来产生多态的rank-1类型?

时间:2017-02-13 06:03:45

标签: haskell partial-application automatic-differentiation rank-n-types

我想将函数f :: T部分应用于值x :: [Double]以获得结果函数f' :: forall a . Floating a => [a] -> aT应该是什么?我无法理解。

一个难点是,在f内,我需要将x :: [Double]f'的第一个参数(让我们称之为y)通过一些数学结合起来(例如添加列表中的每个元素)。

我知道在内部,xy都是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要求其输入函数具有该常规类型。

(为什么我需要部分应用目标函数?你可以想象这样的函数会有内部常量,优化器不应将其作为更改状态向量的一部分来处理。黑客可能会处理常量作为状态的一部分,只是不更新​​常量,但在这种情况下,渐变的范数不会在局部最小值处变为零,其他事情可能会出错。)

0 个答案:

没有答案