Qt:单击按钮=> haskell程序中应显示一条消息

洛尔韦利

我尝试创建一个程序,当使用高级文本3在ubuntu上使用Haskell&Qt在单击按钮时显示文本。但是,显然在定义信号键时会出现问题(该键将识别信号,按钮)。此外,很难找到有关HsQML(绑定加入haskell&Qt)的文档。

代码:

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}

错误信息:

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 (\ _ -> ...), ....];
               .... }

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

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}
本诺夫斯

错误提示您GHC不知道所创建的信号newSignalKey应具有的类型(newSignalKey :: SignalSuffix p => IO (SignalKey p)。GHC不知道p为什么类型,因为您未指定它)。添加像这样的显式类型签名:

skey <- newSignalKey :: IO (SignalKey (IO ()))

应该解决您所看到的错误。

好的,那么现在为什么在第二个示例中可以工作?要了解这一点,我们必须查看GHC知道什么以及它可以确定有关的类型skey

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

do
  ...
  fireSignal skey obj
  ...

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

但是,在第二个示例中,也将skey用于以下模式:

forkIO $ do
  ...
  fireSignal skey obj

由于forkIO期望IO返回一个type值操作,因此()GHC现在知道这一点fireSignal skey obj :: IO ()(因此,在这种情况下,它知道something必须是())。这意味着它p不再是模棱两可的了IO ()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

满足按钮单击条件以在javascript中显示一条消息

来自分类Dev

在QT中单击按钮时创建按钮

来自分类Dev

如何知道在Qt中单击了哪个按钮?

来自分类Dev

如何知道在Qt中单击了哪个按钮?

来自分类Dev

JQuery 在按钮单击时显示上一条消息

来自分类Dev

Qt Creator:单击“信号”按钮以弹出一个窗口

来自分类Dev

单击QT中的按钮时如何创建新窗口?

来自分类Dev

如何通过单击Qt Designer中的按钮来打印日期?

来自分类Dev

当用户名和密码为空白时,单击“登录”按钮将引发一条消息,即如何打印显示的消息

来自分类Dev

每次单击模态弹出按钮时,Reactjs 仅显示第一条记录

来自分类Dev

避免激活应用程序并在单击按钮时集中精力-Windows API或Qt

来自分类Dev

Qt:将单击的信号映射到另一个按钮

来自分类Dev

在用户选择机器人聊天窗口中的按钮后显示一条消息

来自分类Dev

单击按钮显示图像

来自分类Dev

按钮并单击显示

来自分类Dev

单击按钮显示图像

来自分类Dev

单击显示按钮

来自分类Dev

单击按钮显示表格

来自分类Dev

在jQuery中单击按钮

来自分类Dev

单击JavaScript中的按钮

来自分类Dev

单击硒中的按钮

来自分类Dev

按钮onListView中的单击

来自分类Dev

单击JavaScript中的按钮

来自分类Dev

在片段中单击按钮

来自分类Dev

在硒中单击按钮

来自分类Dev

单击 CollectionViewCell 中的按钮

来自分类Dev

列表应单击按钮悬停

来自分类Dev

单击显示或单击外部,或单击同一按钮隐藏

来自分类Dev

单击登录按钮时显示错误消息