Haskell:类似于"do"符号的应用程序`$`运算符?

Cua*_*due 5 haskell

我正在为idleCallback这个表示法提供一个函数:

idleCallback $= Just (do
    modifyIORef world play
    postRedisplay Nothing)
Run Code Online (Sandbox Code Playgroud)

为什么这个(看似相似)符号不起作用?

idleCallback $= Just $ do
    modifyIORef world play
    postRedisplay Nothing
Run Code Online (Sandbox Code Playgroud)

为了节省你的胡扯,类型是:

($=) :: HasSetter s => s a -> a -> IO ()
type IdleCallback = IO ()
data SettableStateVar a 
idleCallback :: SettableStateVar (Maybe IdleCallback)
postRedisplay :: Maybe Window -> IO ()
modifyIORef :: IORef a -> (a -> a) -> IO ()
Run Code Online (Sandbox Code Playgroud)

GHC说:

Couldn't match expected type `Maybe IdleCallback'
            with actual type `a0 -> Maybe a0'
In the second argument of `($=)', namely `Just'
In the expression: idleCallback $= Just
In a stmt of a 'do' block:
  idleCallback $= Just
  $ do { modifyIORef world play;
         postRedisplay Nothing }
Run Code Online (Sandbox Code Playgroud)

是否可以在不将do括号括在括号中的情况下编写?

jam*_*idh 9

这是一个优先级错误....($=)绑定比($)更紧密.您可以在错误消息中看到:

Couldn't match expected type `Maybe IdleCallback'
        with actual type `a0 -> Maybe a0'
In the second argument of `($=)', namely `Just'
Run Code Online (Sandbox Code Playgroud)

它认为($=)的第二个参数是简单的Just(它是引用函数的有效Haskell类型).如果你把括号括在整个Just,包括do-block,它应该工作.