首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt :按钮单击=>消息应该出现在haskell程序中

Qt :按钮单击=>消息应该出现在haskell程序中
EN

Stack Overflow用户
提问于 2016-03-07 15:28:28
回答 1查看 88关注 0票数 2

我试图创建一个程序,当一个按钮被点击时,使用haskell & Qt,在ubuntu上使用崇高的文本3显示文本。但是,很明显,在定义信号键时存在一个问题(当单击按钮时,该键将识别调用的信号)。此外,很难找到关于HsQML (连接haskell & Qt的绑定)的文档。

代码:

代码语言:javascript
复制
module Main where

import Graphics.QML
import Control.Concurrent
import Control.Exception
import Data.IORef
import Data.Text (Text)
import qualified Data.Text as T

    main :: IO ()
    main = do
        state <- newIORef $ T.pack ""
        skey <- newSignalKey
        clazz <- newClass [
            defPropertySigRO' "my_label" skey (\_ -> readIORef state),
            defMethod' "sayHello" (\obj txt -> do
                writeIORef state txt
                fireSignal skey obj
                return ())]
        ctx <- newObject clazz ()
        runEngineLoop defaultEngineConfig {
            initialDocument = fileDocument "exemple2.qml",
            contextObject = Just $ anyObjRef ctx}

错误信息:

代码语言:javascript
复制
Build FAILED

/home/lowley/Documents/haskell/Qt/exemple-2.hs: line 13, column 10:
  No instance for (SignalSuffix (IO a0))
    arising from a use of `newSignalKey'
  The type variable `a0' is ambiguous
  Possible fix: add a type signature that fixes these type variable(s)
  Note: there is a potential instance available:
    instance SignalSuffix (IO ()) -- Defined in `Graphics.QML.Objects'
  Possible fix:
    add an instance declaration for (SignalSuffix (IO a0))
  In a stmt of a 'do' block: skey <- newSignalKey
  In the expression:
    do { state <- newIORef $ T.pack "";
         skey <- newSignalKey;
         clazz <- newClass
                    [defPropertySigRO' "my_label" skey (\ _ -> readIORef state),
                     defMethod' "sayHello" (\ obj txt -> ...)];
         ctx <- newObject clazz ();
         .... }
  In an equation for `main':
      main
        = do { state <- newIORef $ T.pack "";
               skey <- newSignalKey;
               clazz <- newClass
                          [defPropertySigRO' "my_label" skey (\ _ -> ...), ....];
               .... }

解决了!但是我想知道为什么这个程序可以在没有上述错误的情况下编译:

代码语言:javascript
复制
module Main where

import Graphics.QML
import Control.Concurrent
import Control.Exception
import Data.IORef
import qualified Data.Text as T

main :: IO ()
main = do
    state <- newIORef $ T.pack ""
    skey <- newSignalKey
    clazz <- newClass [
        defPropertySigRO' "result" skey (\_ ->
            readIORef state),
        defMethod' "factorial" (\obj txt -> do
            let n = read $ T.unpack txt :: Integer
            writeIORef state $ T.pack "Working..."
            fireSignal skey obj
            forkIO $ do
                let out = T.take 1000 . T.pack . show $ product [1..n]
                evaluate out
                writeIORef state out
                fireSignal skey obj
            return ())]
    ctx <- newObject clazz ()
    runEngineLoop defaultEngineConfig {
        initialDocument = fileDocument "factorial2.qml",
        contextObject = Just $ anyObjRef ctx}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-07 15:38:30

有错误告诉您,GHC不知道newSignalKey创建的信号应该具有什么样的类型(newSignalKey :: SignalSuffix p => IO (SignalKey p) )。GHC不知道p应该是什么,因为您没有指定它)。添加如下显式类型签名:

代码语言:javascript
复制
skey <- newSignalKey :: IO (SignalKey (IO ()))

应该修复您正在看到的错误。

好的,那么为什么在第二个例子中它会工作呢?要理解这一点,我们必须看看GHC知道什么,以及它能决定skey的类型。

在第一个示例和第二个示例中,skey的用法如下:

代码语言:javascript
复制
do
  ...
  fireSignal skey obj
  ...

因为fireSignal :: SignalKey p -> ObjRef () -> p (简化类型,完整类型的fireSignal更通用),所以GHC知道p必须是IO something,因为它是在需要IO something操作(作为IO中的do块的一部分)的上下文中使用的。但是,它不知道something是什么,因为从未使用该IO操作的返回值。因此,它留给了skey :: SignalKey (IO something),并正确地报告了一个错误,即something是不明确的(它不知道something应该是什么类型)。

然而,在第二个示例中,skey也用于以下模式:

代码语言:javascript
复制
forkIO $ do
  ...
  fireSignal skey obj

因为forkIO需要一个返回()类型值的IO操作,所以GHC现在知道fireSignal skey obj :: IO () (因此在本例中,它知道something必须是())。这意味着p不再是模棱两可的,它必须是IO ()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35847550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档