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谢谢,这很有效!我不知道这个函数存在。我想我应该更彻底地讨论一下:-)是否有任何理由特别在类型上下文中包含所有关键字的?我认为这是含蓄的。