如何在Haskell中使用$ operator curry函数应用程序?

时间:2013-07-08 15:05:20

标签: haskell currying

我正在学习haskell并且对函数应用程序运算符$ curry's有点困惑。

根据GHC,$的类型是

*Main>:t ($)
($) :: (a->b) -> a -> b

但我可以输入以下代码

*Main>map ($ 2) [(*2), (+2), (/2)]
[4.0,4.0,1.0]

根据$的签名,虽然我认为我需要使用翻转函数,因为$的第一个参数是(a-> b)。

例如,我无法执行以下操作

curry_test :: Integer -> String -> String
curry_test x y = (show x) ++ " " ++ y
*Main> let x = curry_test "123"
    Couldn't match expected type `Integer' with actual type `[Char]'
In the first argument of `curry_test', namely `"123"'
In the expression: curry_test "123"
In an equation for `x': x = curry_test "123"

但我能做到

let x = curry_test 2

1 个答案:

答案 0 :(得分:11)

中缀运营商有特殊规定。查看此页面:http://www.haskell.org/haskellwiki/Section_of_an_infix_operator

基本上,由于$是中缀运算符,($ 2)实际上将2修复为$的第二个参数,因此它等同于flip ($) 2

这个想法是让操作员更直观地进行部分应用,例如,如果您map (/ 2)超过列表,您可以想象将列表的每个元素放在左侧的“缺失”位置。分裂标志。

如果您想以这种方式使用curry_test功能,可以执行

let x = (`curry_test` "123")