Syntax 如何在一行中混合绑定(<;-)和赋值(let)?(在哈斯克尔)

Syntax 如何在一行中混合绑定(<;-)和赋值(let)?(在哈斯克尔),syntax,haskell,syntactic-sugar,Syntax,Haskell,Syntactic Sugar,这是关于Haskell中的语法糖。一个简单的Haskell程序: main = do args <- getArgs let first = head args print first 但是有没有更好的方法,不让(>>=)和返回的行变得混乱?这个怎么样 import Control.Monad main = do first <- liftM head getArgs print first import-Control.Monad main=do 首先

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

main = do
  args <- getArgs
  let first = head args
  print first
但是有没有更好的方法,不让(>>=)和返回的行变得混乱?

这个怎么样

import Control.Monad

main = do
   first <- liftM head getArgs
   print first
import-Control.Monad
main=do

首先也可以像这样使用
ap
函数(使用类型
Monad m=>m(a->b)->ma->mb
):

import System
import Control.Monad

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

绑定和返回是如何实现的

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

main=liftM头getArgs>>=print

liftM
head
都很好,但我们不要忘记模式匹配:

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

main=do{arg:\还有另一种可能性:

main = putStr . head =<< getArgs

main=putStr.head=D'oh!比我快19秒。是的,这比我快得多。谢谢!甚至更好:
main=liftM head getArgs>=print
:)谢谢。我不知道
ap
。对于那些有应用品味的人,
ap
=和
liftM
=我通常认为返回是“包装到单子中”,并且(>>=)作为“展开和替换”。因此,阅读代码类似于“展开和替换,然后再次包装,然后展开和替换”。因此,liftM对我来说更具可读性,因为它只是“使函数一元”。因此,我喜欢选项2。很好。我没有想到反向版本。谢谢。
main = do { arg:_ <- getArgs; print arg }
main = do
    arg : _ <- getArgs
    print arg
main = putStr . head =<< getArgs