6

これが一般的な質問である場合は申し訳ありません。私はこの単純なIO()機能を持っています:

greeter :: IO()
greeter = do
  putStr "What's your name? "
  name <- getLine
  putStrLn $ "Hi, " ++ name

ここで、実際に操作する必要がないように、を呼び出すgreeterと同時に を事前に入力するパラメーターを指定したいと考えています。getLine関数のようなものを想像します

IOwithinputs :: [String] -> IO() -> IO()

それなら私はするだろう

IOwithinputs ["Buddy"] greeter

IOこれにより、次のようなユーザー入力を必要としないアクションが生成されます。

What's your name?
Hi, Buddy

IO()元の関数を変更せずにこれを行いたいですgreetergreeterまた、コマンドラインからの入力をコンパイルしてパイプしたくありません。Hoogleのようなものは見当たりませんIOwithinputs。(withArgs興味をそそるタイプと名前ですが、私が望むものではありません。)これを行う簡単な方法はありますか?それとも何らかの理由で不可能ですか?これがパイプの目的ですか?

4

3 に答える 3

0

一度IO入ると、入力を取得する方法を変更することはできません。についての質問に答えるpipesには、はい、次のように定義して入力を抽象化することができますConsumer

import Pipes
import qualified Pipes.Prelude as P

greeter :: Consumer String IO ()
greeter = do
    lift $ putStr "What's your name? "
    name <- await
    lift $ putStrLn $ "Hi, " ++ name

次に、コマンドラインを入力として使用するように指定できます。

main = runEffect $ P.stdinLn >-> greeter

... または文字列の純粋なセットを入力として使用するには:

main = runEffect $ each ["Buddy"] >-> greeter
于 2013-11-13T20:41:22.260 に答える