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

 mobiledu2502927445 发布于 2023-02-10 12:03

我正在为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括号括在括号中的情况下编写?

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

    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,它应该工作.

    2023-02-10 12:06 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有