在具有多个参数的haskell中部分应用

给定函数f(x1,x2,x3,...,xN)通常可以将它部分应用于多个地方。 例如,对于N = 3,我们可以定义g(x)= f(1,x,3)。 然而,Haskell中的标准部分应用程序不能以这种方式工作,只允许我们通过修复其第一个参数来部分应用函数(因为所有函数实际上只带一个参数)。 有没有简单的方法来做这样的事情:

g = f _ 2 _
g 1 3

输出值为f 1 2 3 ? 当然,我们可以做一个lambda函数

g=(x1 x3 -> f x1 2 x3)

但我觉得这很难读。 例如,在Mathematica中它是这样工作的,我觉得它很不错:

g=f[#1,2,#2]&
g[1,3]

输出f[1,2,3]

编辑:也许我应该说更多的动机。 我想在点式组合中使用这种部分应用的函数,即在这样的表达式中:

h = g. f _ 2 . k

得到h 3 = g(f(k(3),2))


你可以阅读这个关于如何改变参数顺序的问题,然后使用部分应用程序,但是目前在Haskell中最干净和最清晰的方法就是直接:

g x y = f x 2 y

不,最简单的方法是定义一个lambda。 你或许可以尝试和flip玩,但我怀疑它会比拉姆达更干净简单。 特别是对于更长的参数列表。


最简单(也是规范)的方法是定义一个lambda。 如果在可能的情况下使用有意义的参数名称,它会更具可读性

getCurrencyData :: Date -> Date -> Currency -> IO CurrencyData
getCurrencyData fromDate toDate ccy = {- implementation goes here -}

你可以用lambda语法定义你的新函数

getGBPData = from to -> getCurrencyData from to GBP

或没有它

getGBPData from to = getCurrencyData from to GBP

或者你可以使用组合器,但我认为这很难看

getGBPData = from to -> getCurrencyData from to GBP
           = from to -> flip (getCurrencyData from) GBP to
           = from    -> flip (getCurrencyData from) GBP
           = from    -> (flip . getCurrencyData) from GBP
           = from    -> flip (flip . getCurrencyData) GBP from
           =             flip (flip . getCurrencyData) GBP
链接地址: http://www.djcxy.com/p/43029.html

上一篇: Partial application in haskell with multiple arguments

下一篇: How do I get the type signature of the range function in Haskell?