簡體   English   中英

Haskell,在使用IO整數計算該字符串時返回String

[英]Haskell, returning String while using IO Integer to compute that string

今天,我遇到了以下問題:

我可以使用名為getScreenWidth的函數使用Xlib綁定讀取Haskell中的當前屏幕分辨率(->我得到IO整數)。 到目前為止,這是可行的。

現在,我想將該值用作桌面環境(xmonad)插件的標簽。 插件基礎結構僅允許將“ WorkspaceId”(基本上是整數)映射到String的函數。

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

目前,我正在使用自己的函數將ID映射到字符串,該字符串可以正常工作:

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

輸出是預期的“桌面:1”(或任何我在的ID)。

現在,我希望它是“ Desktop:1(1680px)”,其中1680等於getScreenWidth的返回值。

我的問題: getScreenWidth返回IO整數,所以我不能簡單地使用,

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

因為我的返回類型不是字符串。 Google告訴我,我無法在Haskell中將“ IO Integer”轉換為“ Integer”,所以我真的不知道如何使用原型時如何保留原型/構造函數(無論Haskell稱其為“ WorkspaceId-> String”)。 “ IO整數”生成該字符串。

那有可能嗎? 如果是這樣,怎么辦?

我從未使用過XMonad:我將這個答案基於Haskell的一般知識以及我在2½分鍾內在互聯網上發現的內容。

無論如何,我假設你的地方有一個main調用xmonad

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)它可以將String期從衍生IO String S和Integer期從衍生IO Integer S,等,所以這是你在在配置中使用getScreenWidth

一旦進入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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM