问题答案
经常在haskell代码里面看到
 
$ do
 
$这样的 dollor 符号有什么用?
标签: Haskell
答案
$ 接受一个函数,接受一个参数,然后将函数应用到参数上。
 
($) :: (a -> b) -> a -> b`
说是这么说,其实f $ a和f a的意思是完全一样的。那么为什么还要有这个东西呢?这是因为$是向右结合的,而且优先级比较低,所以作为语法糖被广泛被应用在很多地方。比如你想写
 
print 1 + 2
但是考虑到+的优先级比函数应用低,你不能这么写,而只能加括号:
 
print (1 + 2)
但是如果不喜欢括号,用$就可以这么写:
 
print $ 1 + 2 
对于楼主的问题,$ do xxx这个写法是非常常见的。这是因为,很多monadic function都是这个形式(比如forkIO,forever,forM和runRWS):
 
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,可以很方便的查询各种函数(不管是普通函数还是符号形式的函数)。$ 接受一个函数,接受一个参数,然后将函数应用到参数上。
 
($) :: (a -> b) -> a -> b`
说是这么说,其实f $ a和f a的意思是完全一样的。那么为什么还要有这个东西呢?这是因为$是向右结合的,而且优先级比较低,所以作为语法糖被广泛被应用在很多地方。比如你想写
 
print 1 + 2
但是考虑到+的优先级比函数应用低,你不能这么写,而只能加括号:
 
print (1 + 2)
但是如果不喜欢括号,用$就可以这么写:
 
print $ 1 + 2 
对于楼主的问题,$ do xxx这个写法是非常常见的。这是因为,很多monadic function都是这个形式(比如forkIO,forever,forM和runRWS):
 
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,可以很方便的查询各种函数(不管是普通函数还是符号形式的函数)。
举一反三