这是我的代码:
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 ) )
有什么建议吗?
编辑:小编辑以使此问题寻找更通用的答案(不限于返回函数)
答案 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):
fmap tail getLine
fmap head getLine
fmap (map toUpper) getLine
import Data.Functor
如果您import Control.Applicative
或fmap
,则可以使用<$>
的中缀版本,reverse <$> getLine
:
tail <$> getLine
head <$> getLine
map toUpper <$> getLine
askPointer = do
newInput <- map toUpper <$> getLine
[..here I will re-use new Input..]
return ()
这意味着你也可以写
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