간단한 방법은 Pipe
을 사용하여 핸들에 대한 읽기 및 쓰기를 추상화하는 것입니다. 당신이 사용할 수있는 하나 개의 유형은 다음과 같습니다
original :: IO()
original = do
str1 <- getLine
str2 <- getLine
putStrLn (str1 ++ str2)
새로운 pipes
버전은 다음과 같을 것이다 :
import Pipes
example :: Monad m => Pipe String String m()
example = do
str1 <- await
str2 <- await
yield (str1 ++ str2)
예를 들어
example :: Monad m => Pipe String String m()
이의 원래 코드에 다음과 같은보고 있다고 가정 해 봅시다
그러면 다음과 같이 순전히 테스트 할 수 있습니다.
>>> import qualified Pipes.Prelude as Pipes
>>> Pipes.toList (each ["Hello, ", "world!"] >-> example)
["Hello, world!"]
,210
... 또는 당신이 진짜 입력과 출력을 테스트 할 수는 :
>>> runEffect $ Pipes.stdinLn >-> example >-> Pipes.stdoutLn
Hello, <Enter>
world!<Enter>
Hello, world!
이것은 순수한 기본 논리를 유지하고 순수하게 또는 impurely를 실행할지 여부를 선택할 수 있습니다.
코드를 변경하여 입력 용과 출력용의 두 핸들을 가져 오는 것은 무리가 있습니까? –
글쎄, 내가 생각하기에 깨끗하게 될거야. 나는 내가 그것을 할 수 있었다고 생각한다. – PyRulez
나는 (stdin/out/err에 대해) 핸들을 전달하고 ['Data.Knob'] (https://hackage.haskell.org/package/knob-0.1.1/docs/Data- Knob.html) 인스턴스에 "순수한"테스트가 필요한 경우 –