我正在为idleCallback
这个表示法提供一个函数:
idleCallback $= Just (do modifyIORef world play postRedisplay Nothing)
为什么这个(看似相似)符号不起作用?
idleCallback $= Just $ do modifyIORef world play postRedisplay Nothing
为了节省你的胡扯,类型是:
($=) :: 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 ()
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 }
是否可以在不将do
括号括在括号中的情况下编写?
这是一个优先级错误....($=
)绑定比($
)更紧密.您可以在错误消息中看到:
Couldn't match expected type `Maybe IdleCallback' with actual type `a0 -> Maybe a0' In the second argument of `($=)', namely `Just'
它认为($=
)的第二个参数是简单的Just
(它是引用函数的有效Haskell类型).如果你把括号括在整个Just
,包括do
-block,它应该工作.