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

sas*_*nin 9 syntax haskell syntactic-sugar

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

main = do
  args <- getArgs
  let first = head args
  print first
Run Code Online (Sandbox Code Playgroud)

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

我明白我可以重写绑定"脱糖":

main = do
  first <- getArgs >>= ( return . head )
  print first
Run Code Online (Sandbox Code Playgroud)

但是有没有更好的方法,没有用(>> =)弄乱线路并返回?

Nor*_*sey 16

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

main = do { arg:_ <- getArgs; print arg }
Run Code Online (Sandbox Code Playgroud)

或者如果你喜欢布局

main = do
    arg : _ <- getArgs
    print arg
Run Code Online (Sandbox Code Playgroud)

如果可能的话,最喜欢Haskellers模式匹配了headtail.


Jon*_*nas 10

另一种可能性:

main = putStr . head =<< getArgs
Run Code Online (Sandbox Code Playgroud)


cth*_*ops 9

这个怎么样?

import Control.Monad

main = do
   first <- liftM head getArgs
   print first
Run Code Online (Sandbox Code Playgroud)

  • 甚至更好:`main = liftM head getArgs >> = print`.:) (3认同)

Jon*_*nas 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
Run Code Online (Sandbox Code Playgroud)

这有一个简单的优点,如果你的函数需要几个参数,你可以ap在它们之间使用liftM2,你不需要使用liftM3等等.对于f::a -> b -> c -> d你写的函数

return f `ap` arg1 `ap` arg2 `ap` arg3
Run Code Online (Sandbox Code Playgroud)