1

今日、私は次の問題に遭遇しました:

getScreenWidth という関数を使用して、Xlib バインディングを使用して Haskell で現在の画面解像度を読み取ることができます (--> IO Integer を取得します)。これはこれまでのところ機能しています。

この値を、デスクトップ環境 (xmonad) のプラグインのラベルとして使用したいと考えています。プラグイン インフラストラクチャでは、"WorkspaceId" (基本的には整数) を文字列にマッピングする関数のみが許可されます。

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

現在、私は独自の関数を使用してIDを文字列にマップしていますが、これは機能しています:

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

出力は予想どおり「デスクトップ:1」(または私が使用しているID)です。

ここで、1680 が getScreenWidth の戻り値に等しい "Desktop: 1 (1680px)" にしたいと考えています。

私の問題: getScreenWidth は IO Integer を返すため、単純に使用することはできません。

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

私は戻り値の型が文字列ではないので。Googleは、Haskellでは「IO Integer」を「Integer」に変換できないと言っていたので、プロトタイプ/コンストラクター(Haskellがそれをどのように呼んでも)「WorkspaceId -> String」を使用しながら保持する方法は本当にわかりませんその文字列を生成するための「IO Integer」。

それはまったく可能ですか?もしそうなら、どのように?

4

2 に答える 2

4

私は 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現在使用している は から派生しているため、 s から派生したs やs から派生した sなどIO (XConfig l)を組み込むことができるということです。StringIO StringIntegerIO IntegergetScreenWidth

于 2013-04-24T18:33:37.627 に答える
3

一度入ったら IO モナドを離れることはできないので、 egの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
于 2013-04-24T17:50:13.570 に答える