3

モナドを使ってこれを一行で書き直す方法はありますか?

input <- getLine
let parsed = reads input :: [(Int,String)]

入力を渡す方法を理解できませんでした。私の試みはラムダ表記について考えているでしょう。

4

2 に答える 2

7

の別の場所fmap! fmap値を別のもの (この場合は 内) 内で変更するために使用しますgetLineが、より広く役立ちます。

parsed <- fmap reads getLine :: IO [(Int,String)]

または withimport Data.Functorまたはimport Control.Applicativeあなたはこれを次のように書くことができます

parsed <- reads <$> getLine :: IO [(Int,String)]

コンパイラは、他の場所から意味を推測できる可能性がありますInt。その場合、明示的な型シグネチャを省略できます。

fmap知っておくと非常に便利な機能です。詳細については、fmap に関するこの他の回答を参照してください。ここで、ミニ チュートリアルを作成しました。

実際、ワンライナーをきれいに書く方法に興味があるなら、Applicative Functor についてもっと調べる必要があります。

于 2013-01-09T01:37:39.460 に答える
4

確かに、liftM(またはfmap、インスタンスIOもあるため)を使用して、1 行にまとめることができます。Functor

parsed <- (reads :: ReadS Int) `liftM` getLine

しかし、それによって可読性が向上することはめったにないと私は主張します。

于 2013-01-09T01:23:30.140 に答える