如何在一行中混合绑定(&lt ;-)和赋值(let)? (在Haskell)

时间:2009-03-18 16:50:32

标签: syntax haskell syntactic-sugar

这是关于Haskell中的语法糖。一个简单的Haskell程序:

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

我在第一行(args <- getArgs)中使用绑定,在第二行(let first = ...)中使用纯赋值。有可能将它们合并成一个可读的单行程序吗?

我知道我可以重写绑定“脱糖”:

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

但是有没有更好的方法,不会使(&gt;&gt; =)线条混乱并返回?

5 个答案:

答案 0 :(得分:16)

liftMhead都非常好,但我们不要忘记模式匹配:

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

或者如果你喜欢布局

main = do
    arg : _ <- getArgs
    print arg

如果可能,大多数Haskeller更喜欢headtail上的模式匹配。

答案 1 :(得分:10)

又一种可能性:

main = putStr . head =<< getArgs

答案 2 :(得分:9)

这个怎么样?

import Control.Monad

main = do
   first <- liftM head getArgs
   print first

答案 3 :(得分:6)

也可以使用ap函数(类型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

答案 4 :(得分:1)

如何绑定并返回杂乱?

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

main = liftM head getArgs >>= print