Haskell 如何部分应用一个函数来产生多态的秩-1类型?

Haskell 如何部分应用一个函数来产生多态的秩-1类型?,haskell,partial-application,automatic-differentiation,rank-n-types,Haskell,Partial Application,Automatic Differentiation,Rank N Types,我想对值x:[Double]部分应用函数f::T,以获得所有a的结果函数f'::的值。浮动a=>[a]->a。T应该是什么?我想不出来 一个困难是,在f中,我需要通过一些数学(例如,添加列表中的每个元素)将x::[Double]与f'的第一个参数(我们称之为y)结合起来 我知道在内部,x和y都将是Doubles,因此我最终使用了f::类型作为所有a。浮动a=>[a]->(对于所有b.浮动b=>[b]->b),并在f中使用unsafeccerce(我知道,我知道…)每当a类型的值与b类型组合时 关

我想对值
x:[Double]
部分应用函数
f::T
,以获得所有a的结果函数
f'::的值。浮动a=>[a]->a
T
应该是什么?我想不出来

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

我知道在内部,
x
y
都将是
Double
s,因此我最终使用了
f::类型作为所有a。浮动a=>[a]->(对于所有b.浮动b=>[b]->b)
,并在
f
中使用
unsafeccerce
(我知道,我知道…)每当
a
类型的值与
b
类型组合时

关于
f
的更好类型有什么想法吗

上下文:我被迫为所有a生成更一般的
。在部分应用
f
后浮动a=>[a]->a
类型,因为我需要使用Haskell autodiff库
ad
获取结果函数的梯度。该库中的函数
grad
要求其输入函数具有该常规类型


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

您使用的库是什么?我怀疑这里有一些可怕的误解-这看起来比它应该的复杂得多。:)对于autodiff,此库:您可以在此处找到
grad
的类型:(我当然希望问题比我想象的要简单!)好吧,你为什么不简单地用
realToFrac
来概括输入呢?
:t映射realToFrac[1.0::Double,2.0,3.0]::分数b=>[b]
所以当你部分应用
f
而不是做
f Double
时,你可以做
f(映射realToFrac listOfDoubles)
@Bakuriu谢谢,这很有效!我不知道这个函数存在。我想我应该更彻底地学习:-)是否有任何理由特别在类型上下文中包含所有关键字的
?我认为这些都是隐式的。您使用的库是什么?我怀疑这里有一些可怕的误解-这看起来比应该的复杂得多。:)对于autodiff,这个库:您可以在这里找到
grad
的类型:(我当然希望问题比我想象的要简单!)好吧,为什么不简单地使用
realToFrac
来概括输入<代码>:t映射realToFrac[1.0::Double,2.0,3.0]::分数b=>[b]
因此,当您部分应用
f
而不是执行
f双倍列表
时,您可以执行
f(映射realToFrac双倍列表)
@Bakuriu谢谢,这很有效!我不知道这个函数存在。我想我应该更彻底地讨论一下:-)是否有任何理由特别在类型上下文中包含所有关键字的
?我认为这是含蓄的。