【问题标题】:Haskell, returning String while using IO Integer to compute that stringHaskell,在使用 IO Integer 计算该字符串时返回字符串
【发布时间】:2013-04-24 17:31:56
【问题描述】:

今天遇到了以下问题:

我可以使用名为 getScreenWidth 的函数使用 Xlib 绑定​​读取 Haskell 中的当前屏幕分辨率(--> 我得到一个 IO 整数)。到目前为止,这是有效的。

现在我想将该值用作我的桌面环境 (xmonad) 插件的标签。插件基础结构只允许将“WorkspaceId”(基本上是一个整数)映射到字符串的函数。

...
-- Constructor for PrettyPrint: 
ppCurrent :: WorkspaceId -> String
...

目前我正在使用自己的函数将 ID 映射到字符串,它正在工作:

myPPCurrent :: WorkspaceId -> String
myPPCurrent x = "Desktop: " ++ show x

输出如预期的那样“桌面:1”(或我使用的任何 ID)。

现在我希望它是“桌面:1 (1680px)”,其中 1680 等于 getScreenWidth 的返回值。

我的问题: getScreenWidth 返回 IO Integer,所以我不能简单地使用,

myPPCurrent x = do
    y <- getScreenWidth
    return "Desktop: " ++ show x ++ show y

因为我的返回类型不是字符串。 Google 告诉我,我无法在 Haskell 中将“IO Integer”转换为“Integer”,所以我真的不知道如何在使用"IO Integer" 来生成那个字符串。

这有可能吗?如果有,怎么做?

【问题讨论】:

  • 你需要留在 monad 中。

标签: string haskell io xmonad


【解决方案1】:

我从未使用过 XMonad:我的答案基于一般的 Haskell 知识以及我在 2.5 分钟内在互联网上找到的内容。

无论如何,我假设您在某个地方有一个调用 xmonadmain

main = xmonad myConfig

或许

main = xmonad XConfig {
          normalBorderColor = "#8080ff",
          -- etc

或其他。让我们看看类型。

main :: IO ()
xmonad :: (LayoutClass l Window, Read (l Window)) => XConfig l -> IO ()
myConfig :: XConfig l -- whatever type `l` is

现在假设不是myConfig,而是

makeMyConfig :: IO (XConfig l) -- I still don't know what `l` is

makeMyConfig 不是配置 --- 它会在运行时进行配置,可能取决于磁盘中的文件、时间或屏幕分辨率……您可以这样使用它:

main = do
    config <- makeMyConfig
    xmonad config

关键是因为我们现在使用的XConfig l是从IO (XConfig l)派生的,它可以合并从IO Strings派生的Strings和从IO Integers派生的Integers等。这就是您在配置中使用 getScreenWidth 的原因。

【讨论】:

    【解决方案2】:

    一旦进入 IO monad,您就无法离开,因此您需要返回 IO String 而不是 String,例如

    myPPCurrent :: WorkspaceId -> Integer -> String
    myPPCurrent x = "Desktop: " ++ show x ++ show y
    
    getWorkspaceName :: WorkspaceId -> IO String
    getWorkspaceName id = do
        w <- getScreenWidth
        return $ myPPCurrent id w
    

    【讨论】:

      猜你喜欢
      • 2011-10-01
      • 2021-10-18
      • 2013-05-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 2011-07-02
      • 2013-04-09
      • 1970-01-01
      相关资源
      最近更新 更多