9

これは Haskell のシンタックス シュガーに関するものです。簡単な Haskell プログラム:

main = do
  args <- getArgs
  let first = head args
  print first

最初の行 ( ) でバインドを使用し、2 行目 ( args <- getArgs) で純粋な代入を使用しlet first = ...ます。それらを読みやすいワンライナーにマージすることは可能ですか?

バインドを「脱糖」に書き換えることができることを理解しています。

main = do
  first <- getArgs >>= ( return . head )
  print first

しかし、 (>>=) と return で行を乱雑にすることなく、より良い方法はありますか?

4

5 に答える 5

16

liftMheadすべて非常にうまくいっていますが、パターン マッチングを忘れないようにしましょう。

main = do { arg:_ <- getArgs; print arg }

またはレイアウトが好きなら

main = do
    arg : _ <- getArgs
    print arg

可能であれば、ほとんどの Haskeller は and よりもパターン マッチングを好みheadますtail

于 2009-03-20T00:25:31.367 に答える
10

さらに別の可能性:

main = putStr . head =<< getArgs
于 2009-03-20T19:26:11.423 に答える
9

これはどう?

import Control.Monad

main = do
   first <- liftM head getArgs
   print first
于 2009-03-18T17:16:36.110 に答える
6

ap次のように( type を使用して) 関数を使用することもできますMonad m => m (a -> b) -> m a -> m b

import System
import Control.Monad

main :: IO ()
main = do line <- return head `ap` getArgs
          putStrLn line

apこれには、関数が複数の引数を必要とする場合、それぞれの間で使用できliftM2liftM3などを使用する必要がないという単純な利点がありf::a -> b -> c -> dます。

return f `ap` arg1 `ap` arg2 `ap` arg3
于 2009-03-18T17:24:03.113 に答える
1

bind と return の混乱はどうですか?

main = getArgs >>= (return.head) >>= print

また

main = liftM head getArgs >>= print

于 2009-03-20T00:08:56.697 に答える