16

Haskell do-notation ブロックで、is_root自分が root かどうかを示す変数が必要だとします。

import System.Posix.User
main = do
    uid <- getRealUserID
    is_root <- return $ uid == 0

その煩わしいuid変数は、その 1 つの場所でのみ使用されます。代わりに、これを書くことができればいいのにと思います:

main = do
    is_root <- getRealUserID == 0

しかし、もちろんそれはコンパイルされません。

のような余分な変数を取り除くにはどうすればよいuidですか? これが私が思いついた最高のものです:

import System.Posix.User
main = do
    is_root <- getRealUserID >>= return . ((==) 0)

ブリーチ!より良い方法はありますか?

4

2 に答える 2

23

一つの方法は

fmap (== 0) getRealUserID
于 2014-08-14T18:15:16.250 に答える
6

(あなたの目標はuid、それ自体のために無意味になるのではなく、の範囲を制限することだと思います)

このような単純なケースでは、@pdw の答えがおそらく正しい方法です。ここでは、演算子<$><*>fromControl.Applicativeが特に役立ちます。

foo = do
  are_same <- (==) <$> doThis <*> doThat

もう少し複雑な状況では、ネストされた- を使用できますdo

complicatedEq :: This -> That -> IO Bool

main = do
  are_same <- do
    this <- doThis
    that <- doThatBasedOn this
    complicatedEq this that
  ... rest ...

非常に長いものは、おそらくそれ自体が機能するに値します。

于 2014-08-14T18:35:28.487 に答える