Haskell 语言的 dollor 符号有什么用

经常在haskell代码里面看到

$ do
阅读 6.6k
3 个回答

$ 接受一个函数,接受一个参数,然后将函数应用到参数上。

($) :: (a -> b) -> a -> b`

说是这么说,其实f $ af a的意思是完全一样的。那么为什么还要有这个东西呢?这是因为$是向右结合的,而且优先级比较低,所以作为语法糖被广泛被应用在很多地方。比如你想写

print 1 + 2

但是考虑到+的优先级比函数应用低,你不能这么写,而只能加括号:

print (1 + 2)

但是如果不喜欢括号,用$就可以这么写:

print $ 1 + 2 

对于楼主的问题,$ do xxx这个写法是非常常见的。这是因为,很多monadic function都是这个形式(比如forkIOforeverforMrunRWS):

someM :: SomeMonad m => m a -> b

那么我们为了能让解析器成功解析出do以及后面的多行内容,就需要用到$。比如

import Control.Monad (liftM)

whenM :: Monad m => m Bool -> m () -> m ()
whenM mb m = do
  b <- mb
  if b then m else return ()

-- 如果输入True就会输出一些字,如果输入False就什么都不做
main = whenM (liftM read getLine) $ do
  putStrLn "Your input is True"
  putStrLn "Truly truly outrageous"

这里使用$,写起来就非常方便了。

推荐一个网站:Hoogle,可以很方便的查询各种函数(不管是普通函数还是符号形式的函数)。

补充一点,善用ghci:

Prelude> :info ($)
($) :: (a -> b) -> a -> b       -- Defined in `GHC.Base'
infixr 0 $

节约括号

map ($ 1) [sin, cos]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏