这是关于Haskell中的语法糖。一个简单的Haskell程序:
main = do
args <- getArgs
let first = head args
print first
我在第一行(args <- getArgs
)中使用绑定,在第二行(let first = ...
)中使用纯赋值。有可能将它们合并成一个可读的单行程序吗?
我知道我可以重写绑定“脱糖”:
main = do
first <- getArgs >>= ( return . head )
print first
但是有没有更好的方法,不会使(&gt;&gt; =)线条混乱并返回?
答案 0 :(得分:16)
liftM
和head
都非常好,但我们不要忘记模式匹配:
main = do { arg:_ <- getArgs; print arg }
或者如果你喜欢布局
main = do
arg : _ <- getArgs
print arg
如果可能,大多数Haskeller更喜欢head
和tail
上的模式匹配。
答案 1 :(得分:10)
又一种可能性:
main = putStr . head =<< getArgs
答案 2 :(得分:9)
这个怎么样?
import Control.Monad
main = do
first <- liftM head getArgs
print first
答案 3 :(得分: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
这有一个简单的优点,即如果您的函数需要多个参数,则可以在每个参数之间使用ap
,而不需要使用liftM2
,liftM3
等。你写的函数f::a -> b -> c -> d
return f `ap` arg1 `ap` arg2 `ap` arg3
答案 4 :(得分:1)
如何绑定并返回杂乱?
main = getArgs >>= (return.head) >>= print
或
main = liftM head getArgs >>= print