1

これは私のコードです:

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

このコードを1行だけ短くすることは可能ですか?

私の試みは失敗しました:

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 toUpperの の結果に適用されます。getLinenewInput

インタープリターでこれらを試してください (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 に答える