存储在变量(Haskell)之前对用户getLine结果的操作

时间:2013-01-09 00:43:23

标签: haskell

这是我的代码:

askPointer = do
  input <- getLine
  let newInput = map toUpper input
  [..here I will re-use new Input..]
  return ()

是否可以(可能使用lamba表示法),只在一行中缩短此代码?

我的尝试没有成功:

input <- (\a b-> do toUpper (b <- getLine ) )

有什么建议吗?

编辑:小编辑以使此问题寻找更通用的答案(不限于返回函数)

2 个答案:

答案 0 :(得分:6)

在使用之前将函数应用于IO操作的结果是对fmap所做的一个很好的描述。

askPointer = do
  newInput <- fmap (map toUpper) getLine
  [..here I will re-use new Input..]
  return ()

因此fmap完全符合您的要求 - 在将map toUpper绑定到getLine之前,它会将newInput应用于fmap reverse getLine的结果。

在你的翻译中尝试这些(ghci / hugs):

  1. fmap tail getLine
  2. fmap head getLine
  3. fmap (map toUpper) getLine
  4. import Data.Functor
  5. 如果您import Control.Applicativefmap,则可以使用<$>的中缀版本,reverse <$> getLine

    1. tail <$> getLine
    2. head <$> getLine
    3. map toUpper <$> getLine
    4. askPointer = do newInput <- map toUpper <$> getLine [..here I will re-use new Input..] return ()
    5. 这意味着你也可以写

      fmap
      确实

      {{1}}是一个非常有用的功能。你可以在other answer about fmap阅读更多内容,我最后写了一个迷你教程。

答案 1 :(得分:3)

这应该有效:

askPointer = getLine >>= return . map toUpper

如果你import Control.Applicative,你可以缩短它:

askPointer = map toUpper <$> getLine

考虑上次编辑:

input <- getLine >>= return . map toUpper

input <- map toUpper <$> getLine