对于楼主的问题,$ 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"
$
接受一个函数,接受一个参数,然后将函数应用到参数上。说是这么说,其实
f $ a
和f a
的意思是完全一样的。那么为什么还要有这个东西呢?这是因为$
是向右结合的,而且优先级比较低,所以作为语法糖被广泛被应用在很多地方。比如你想写但是考虑到
+
的优先级比函数应用低,你不能这么写,而只能加括号:但是如果不喜欢括号,用
$
就可以这么写:对于楼主的问题,
$ do xxx
这个写法是非常常见的。这是因为,很多monadic function都是这个形式(比如forkIO
,forever
,forM
和runRWS
):那么我们为了能让解析器成功解析出do以及后面的多行内容,就需要用到
$
。比如这里使用
$
,写起来就非常方便了。推荐一个网站:Hoogle,可以很方便的查询各种函数(不管是普通函数还是符号形式的函数)。