[英]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.