1

这是我的代码:

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

是否有可能(可能使用兰巴符号)仅在一行中缩短此代码?

我的尝试没有成功:

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

有什么建议吗?

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

4

2 回答 2

6

在使用之前将函数应用于 IO 操作的结果是很好的描述fmap

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

所以这里fmap完全符合您的要求 - 它适用map toUppergetLine您将其绑定到newInput.

在您的解释器中尝试这些(ghci/hugs):

  1. fmap reverse getLine
  2. fmap tail getLine
  3. fmap head getLine
  4. fmap (map toUpper) getLine

如果你import Data.Functor或,你可以使用 ,的import Control.Applicative中缀版本fmap<$>

  1. reverse <$> getLine
  2. tail <$> getLine
  3. head <$> getLine
  4. map toUpper <$> getLine

这意味着你也可以写

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

fmap确实是一个非常有用的功能。您可以在关于 fmap的其他答案中阅读更多内容,我最终在其中编写了一个迷你教程。

于 2013-01-09T01:27:13.487 回答
3

这应该有效:

askPointer = getLine >>= return . map toUpper

如果你import Control.Applicative可以让它更短:

askPointer = map toUpper <$> getLine

考虑到上次编辑:

input <- getLine >>= return . map toUpper

或者

input <- map toUpper <$> getLine
于 2013-01-09T00:50:51.943 回答