当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在一行中混合绑定(<-)和赋值(let)?(在Haskell)》经验,为你挑选了4个好方法。

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

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

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

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

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

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



1> Norman Ramse..:

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

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

或者如果你喜欢布局

main = do
    arg : _ <- getArgs
    print arg

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



2> Jonas..:

另一种可能性:

main = putStr . head =<< getArgs



3> cthulahoops..:

这个怎么样?

import Control.Monad

main = do
   first <- liftM head getArgs
   print first


甚至更好:`main = liftM head getArgs >> = print`.:)

4> Jonas..:

也可以使用这样的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在它们之间使用liftM2,你不需要使用liftM3等等.对于f::a -> b -> c -> d你写的函数

return f `ap` arg1 `ap` arg2 `ap` arg3

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有