Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Haskell,在使用IO Integer计算该字符串时返回字符串_String_Haskell_Io_Xmonad - Fatal编程技术网

String Haskell,在使用IO Integer计算该字符串时返回字符串

String Haskell,在使用IO Integer计算该字符串时返回字符串,string,haskell,io,xmonad,String,Haskell,Io,Xmonad,今天我遇到了以下问题: 我可以使用名为getScreenWidth(->我得到一个IO整数)的函数,使用Xlib绑定读取Haskell中的当前屏幕分辨率。到目前为止,这是有效的 现在我想用这个值作为我的桌面环境(xmonad)插件的标签。插件基础设施只允许将“WorkspaceId”(基本上是一个整数)映射到字符串的函数 ... -- Constructor for PrettyPrint: ppCurrent :: WorkspaceId -> String ... 目前,我正在使用

今天我遇到了以下问题:

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

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

...
-- Constructor for PrettyPrint: 
ppCurrent :: WorkspaceId -> String
...
目前,我正在使用自己的函数将ID映射到字符串,该函数正在工作:

myPPCurrent :: WorkspaceId -> String
myPPCurrent x = "Desktop: " ++ show x
输出如预期的“Desktop:1”(或我使用的任何ID)

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

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

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

y一旦进入IO单子,就不能离开它,因此需要返回一个
IO字符串,而不是
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
myPPCurrent::WorkspaceId->Integer->String
myPPCurrent x=“桌面:”++show x++show y
getWorkspaceName::WorkspaceId->IO字符串
getWorkspaceName id=do

w一旦进入IO单子,就不能离开它,因此需要返回一个
IO字符串,而不是
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
myPPCurrent::WorkspaceId->Integer->String
myPPCurrent x=“桌面:”++show x++show y
getWorkspaceName::WorkspaceId->IO字符串
getWorkspaceName id=do

w我从未使用过XMonad:我的回答基于Haskell的一般知识和我在2½分钟内在互联网上找到的东西

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

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
现在,假设我们有

makeMyConfig :: IO (XConfig l) -- I still don't know what `l` is
makeMyConfig
不是一种配置——它是在运行时进行配置的东西,可能取决于来自磁盘的文件、时间或屏幕分辨率。。。。你这样使用它:

main = do
    config <- makeMyConfig
    xmonad config
main=do

config我从未使用过XMonad:我的回答基于Haskell的一般知识和我在2½分钟内在互联网上找到的东西

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

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
现在,假设我们有

makeMyConfig :: IO (XConfig l) -- I still don't know what `l` is
makeMyConfig
不是一种配置——它是在运行时进行配置的东西,可能取决于来自磁盘的文件、时间或屏幕分辨率。。。。你这样使用它:

main = do
    config <- makeMyConfig
    xmonad config
main=do

配置您需要留在monad中。您需要留在monad中。