1

我正在尝试暂停计算,然后按需恢复它(根据用户的提示)。它应该类似于以下内容,仅使用延续单子。

import Control.Monad.IO.Class (liftIO,MonadIO(..))
import Data.Void

f :: MonadIO m => Int -> Int -> m Void
f x y = do
  liftIO (print x)
  input <- liftIO getLine
  if input /= "pause"
     then (f (x+1) y)
     else (f' y x)

f' :: MonadIO m => Int -> Int -> m Void
f' x y = do
  liftIO (print x)
  input <- liftIO getLine
  if input /= "pause"
     then (f' (x-1) y)
     else (f y x)

示例输出:

λ> f 5 5
5

6

7

8
pause
5

4

3

2
pause
8

9

10
Interrupted.

问题的原始版本:

-- Helpers
cond = fmap (not . (== "pause")) getLine
ch b x y = if b then x else y
ch' :: a -> a -> Bool -> a
ch' = flip . (flip ch)

-- Main code
f i i' = liftIO (print i) >> liftIO cond >>= ch' (f (i+1) i') (f' i'  i)
f' i i' = liftIO (print i) >> liftIO cond >>= ch' (f' (i-1) i') (f i' i)
4

0 回答 0