Haskell "아무것도하지 않는"IO 또는 그렇지 않은 경우


81

Haskell에서 다음과 같은 작업을하고 싶습니다.

main1 = do s <- getLine
           if s == "foo" then putStr "You entered foo"

없음 때문에 분명히 이것은 합법적이지 않습니다 else. 내가 생각한 한 가지 대안 :

nop :: IO ()
nop = sequence_ []

main2 = do s <- getLine
           if s == "foo" then putStr "You entered foo" else nop

이것은 약간 장황하지만 필요한 경우 해결하겠습니다. 하지만 내장 버전이 없다면 놀랄 것 nop입니다.

또는 :

doIf :: Bool -> IO () -> IO ()
doIf b m = if b then m else nop

main3 = do s <- getLine
           doIf (s == "foo") (putStr "You entered foo")

이것은 더 간결하지만 구문은 특별히 좋지 않습니다. 다시 말하지만, 이미 존재하는 내장 된 것을 찾아도 놀라지 않을 것입니다.

이 작업을 수행하는 데 선호되는 방법은 무엇입니까?

답변:


116

모나드에서 no-op을 수행하는 가장 쉬운 방법은 다음과 같습니다.

return ()

동등하게 :

pure ()

그러나 당신이하고있는 특정 관용구에 대해 이미 당신을 위해 만들어진 조합자가 있습니다.

import Control.Monad
main = do s <- getLine
          when (s == "foo") $ putStr "You entered foo"

whencombinator는 combinator와 똑같이 작동합니다. doIf:)


1
죄송합니다. return ()에 대해 생각했지만 실제로 반환 될 것이라고 생각했습니다 (즉, do-expression의 나머지 항목을 단락). 내 잘못이야. 언제를 알려 주셔서 감사합니다.
Dave B

7
return은 일종의 나쁜 이름입니다. 예 :)
bdonlan

9
@Dave returnHaskell에서는 언어 구조가 아니라 함수일뿐입니다 (bdonian이 말했듯이 잘못 선택한 이름을 사용). Return은 제어 흐름에 영향을주지 않습니다. 또는 작성할 수 do {s <- getLine; return (); putStrLn s}있습니다. 잘 실행됩니다.
Tom Lokhorst

나는 점점 오전 Not in scope: `when'에 대해 test = do (when True (putStrLn "Hello")).
Qwertie 2014 년

3
죄송 합니다. 파일 상단에 when필요 import Control.Monad합니다.
Qwertie

21

Hoogle 을 사용 하여 함수를 찾을 수 있습니다 when. 이 경우 .

Hoogle에서 유형 서명을 입력 할 수 있으며 유형을 통합하고 인수를 재정렬하여 표준 라이브러리에서 일치하는 함수를 찾으려고합니다.

귀하의 경우 Bool-> IO ()-> IO () 와 같이 doIf함수 유형을 간단히 입력 할 수 있습니다 . 여기에서 세 번째 답이고 그 반대 도 있습니다.whenunless

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.