1

私は Haskell 初心者で、現時点では xmonad の構成にのみ使用しています。

アイコンを取得するためにホームディレクトリをハードコードする必要がないようにするために、構成をgitリポジトリに入れたいです。

http://www.haskell.org/haskellwiki/How_to_get_rid_of_IOをチェックアウトしまし たが、理解するにはあまりにも無知です。

hd h = h =<< getHomeDirectory

getIcon::String -> String
getIcon out = ( "^i("++hd++".xmonad/dzen2/"++out )

これは実際に可能ですか?もしそうなら、どのように?私はディレクトリを操作したくありません。文字列としてパスが必要なだけで、それは私を殺しています。

エラーは次のとおりです。

Couldn't match expected type `[Char]'
            with actual type `(FilePath -> IO b0) -> IO b0'
In the first argument of `(++)', namely `hd'
In the second argument of `(++)', namely
  `hd ++ ".xmonad/dzen2/" ++ out'
In the expression: ("^i(" ++ hd ++ ".xmonad/dzen2/" ++ out)

IOモナドがまったく削除されていないように見えます。

更新:わかりました。IO ルールに適応する方法を学びます。それまでは、ハードコーディングしたままにして、適切なビットを置き換えるスクリプトで構成ファイルを複製します。

4

4 に答える 4

6

IOを行うgetIconため、タイプが間違ってgetHomeDirectoryいます。

getIcon :: String -> IO String
getIcon out = do
     hd <- getHomeDirectory
     return $ "^i(" ++ hd ++ ".xmonad/dzen2/" ++ out

Haskell は、ハードディスクの読み取りなど、副作用のあるコードをタイプによって区別することに注意してくださいIO

したがって、呼び出し元も IO になります。

main = do
    s <- getIcon "foo"
    .. now you have a regular string 's' ...
于 2013-03-12T15:06:24.243 に答える
1

呼び出しているポイントでコードを変更できますgetIconか?

呼び出す前にホームディレクトリを取得できる場合は、

getIcon :: String -> String -> String
getIcon out hd = ( "^i("++hd++".xmonad/dzen2/"++out )

そして、どこから電話をかけても(それも入っていると仮定してIO

someIOFunction = do
    things
    ....
    hd <- getHomeDirectory
    getIcon out hd

他に何も機能しない場合の最後の手段を指摘するだけですがunsafePerformIO、実際に使用する必要はなかったので(一般的には嫌われているように感じます)、そこではあまりお役に立てません。

于 2013-03-12T15:56:28.777 に答える
1

他のモナドから「抜け出す」ことはできますが、IO モナドから抜け出すことはできません。Xmonad 構成ファイルの次のようなものは、おそらくあなたが望むものです:

getIcon::String -> String
getIcon out = ( "^i("++hd++".xmonad/dzen2/"++out )

main =
   h <- getHomeDirectory
   let myIcon = getIcon "Firefox"
   xmonad $ desktopConfig . . . -- use myIcon somewhere in this expression
于 2013-03-13T14:07:25.663 に答える