命名函数($)或(>> =)

时间:2017-12-28 00:31:52

标签: haskell

($)(>>=)为开头的函数有哪些?我并没有确切地问$>>=是什么意思,但我理解

f :: Int -> Int
f x = x+2

是一个取整数并加两个的函数,但是在学习Haskell的过程中我遇到的问题是解决方案类似于以下内容:

($) :: (a -> b) -> (a -> b)
f $ x = f x

来自What does $ mean/do in Haskell?

我认为这意味着函数($)采用lambda(a - > b)并输出lambda(a - > b),然后下一行我不确定。

但我总是假设功能定义

f :: Int -> Int

必须跟一个带有参数的函数,这个函数以f开头,就像我的第一个代码示例一样。

由于

1 个答案:

答案 0 :(得分:7)

1 + 2f $ x等中缀应用程序分别只是(+) 1 2($) f x的语法糖。这不管它们是出现在模式匹配(=的左侧)还是出现在表达式中。所以,你的片段去了

f :: Int -> Int
f x = (+) x 2

($) :: (a -> b) -> (a -> b)
($) f x = f x

后者也可以写成

apply :: (a -> b) -> a -> b
apply f x = f x

语法规则是:如果标识符由字母(可能是数字,在非前导位置)组成,则它被解析为右边所有参数的函数,或者如果没有参数则简单地作为常量值。如果它由任何其他符号组成并且没有被括号括起来,则它被解析为中缀,即desugared,因此左边的任何一个用作第一个参数,而右边的任何一个用作第二个参数。