Syntax 如何在一行中混合绑定(<;-)和赋值(let)?(在哈斯克尔)
这是关于Haskell中的语法糖。一个简单的Haskell程序: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 首先
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