这是关于Haskell中的语法糖.一个简单的Haskell程序:
main = do args <- getArgs let first = head args print first
我在第一行(args <- getArgs
)中使用绑定,在第二行()中使用纯赋值let first = ...
.有可能将它们合并成一个可读的单行程序吗?
我明白我可以重写绑定"脱糖":
main = do first <- getArgs >>= ( return . head ) print first
但是有没有更好的方法,没有用(>> =)弄乱线路并返回?
liftM
并且head
都很好,但我们不要忘记模式匹配:
main = do { arg:_ <- getArgs; print arg }
或者如果你喜欢布局
main = do arg : _ <- getArgs print arg
如果可能的话,最喜欢Haskellers模式匹配了head
和tail
.
另一种可能性:
main = putStr . head =<< getArgs
这个怎么样?
import Control.Monad main = do first <- liftM head getArgs print first
也可以使用这样的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