如何为DBus的org.freedesktop.Notifications.Notify创建a{sv}类型值?
解决Haskell中DBus Notify方法a{sv}类型参数的问题
你遇到的核心问题是没搞清楚DBus类型与Haskell类型的对应关系:
- DBus的
a{sv}是字符串键到Variant值的字典类型,不是数组; - 所谓“可选提示”不是用Haskell的
Maybe类型,而是传空字典即可。
正确的类型对应
DBus的a{sv}对应Haskell dbus库中的Map String Variant(或HashMap String Variant,取决于你用的容器实现),而你之前用的[(String, Variant)]是DBus数组类型a(sv),和字典完全是两种类型,所以运行时会报错类型不匹配。
具体实现步骤
导入必要模块
确保导入容器模块和DBus相关模块:import qualified Data.Map as Map import DBus (Variant, toVariant) import DBus.Client创建空提示字典
如果不需要任何提示,直接用空Map:emptyHints :: Map String Variant emptyHints = Map.empty创建带自定义提示的字典
比如要设置通知超时时间、优先级等,直接往Map里添加键值对:customHints :: Map String Variant customHints = Map.fromList [ ("timeout", toVariant (3000 :: Int)) -- 3秒超时 , ("urgency", toVariant (1 :: Byte)) -- 中等优先级 ]调用Notify方法时传入正确参数
在构造methodCall的参数列表时,把hints参数用toVariant包装后传入(因为Map String Variant已经实现了IsVariant实例):main :: IO () main = do client <- connectSession let notifyCall = methodCall (objectPath "/org/freedesktop/Notifications") (interfaceName "org.freedesktop.Notifications") (memberName "Notify") args = [ toVariant ("MyHaskellApp" :: String) , toVariant (0 :: Word32) , toVariant ("" :: String) , toVariant ("Test Notification" :: String) , toVariant ("This uses correct a{sv} hints!" :: String) , toVariant ([] :: [String]) , toVariant emptyHints -- 这里传入正确的字典类型 , toVariant (-1 :: Int32) ] _ <- call client notifyCall defaultCallFlags 1000 disconnect client
为什么之前的尝试失败
- 用
Maybe [(String, Variant)]:dbus库没有为这个嵌套类型实现IsVariant实例,所以编译不通过; - 用
[] :: [(String, Variant)]:这对应DBus的数组类型a(sv),而Notify方法要求的是字典a{sv},类型不匹配导致运行时错误。
内容的提问来源于stack exchange,提问作者Enlico
相关产品推荐
相关产品推荐

