9

我正在学习haskell,对函数应用运算符$ curry 的操作有点困惑。

根据 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
4

1 回答 1

11

中缀运算符有特殊规则。请参阅此页面:http ://www.haskell.org/haskellwiki/Section_of_an_infix_operator

基本上,since$是一个中缀运算符,($ 2)实际上固定2为 的第二个参数$,所以它等价于flip ($) 2

这个想法是让运算符的部分应用更直观,例如,如果你map (/ 2)在一个列表上,你可以想象将列表的每个元素放在除号左侧的“缺失”位置。

如果你想以curry_test这种方式使用你的功能,你可以这样做

let x = (`curry_test` "123")
于 2013-07-08T15:12:30.837 回答