9

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

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

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

我知道我可以重写绑定“去糖”:

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

但是有没有更好的方法,而不用 (>>=) 弄乱一行并返回?

4

5 回答 5

16

liftMhead一切都很好,但我们不要忘记模式匹配:

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

或者如果你喜欢布局

main = do
    arg : _ <- getArgs
    print arg

如果可能,大多数 Haskeller 更喜欢模式匹配而不是headtail

于 2009-03-20T00:25:31.367 回答
10

还有一种可能:

main = putStr . head =<< getArgs
于 2009-03-20T19:26:11.423 回答
9

这个怎么样?

import Control.Monad

main = do
   first <- liftM head getArgs
   print first
于 2009-03-18T17:16:36.110 回答
6

也可以像这样使用ap函数(带有 type 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在每个参数之间使用,而您不需要使用liftM2liftM3。对于f::a -> b -> c -> d您编写的函数

return f `ap` arg1 `ap` arg2 `ap` arg3
于 2009-03-18T17:24:03.113 回答
1

如何绑定和返回混乱?

main = getArgs >>= (return.head) >>= print

或者

main = liftM head getArgs >>= print

于 2009-03-20T00:08:56.697 回答