在具有多个参数的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?