プログラミングhaskell 9章 version scala 〜前半〜

def getChar: IO[Char] = IO(System.in.read().toChar)

def putChar(c: Char): IO[Unit] = IO(print(c))

def echo: IO[Unit] =
  for {
    c <- getChar
    _ <- putChar('\n')
    _ <- putChar(c)
    _ <- putChar('\n')
  } yield ()

def getLine: IO[List[Char]] =
  for {
    x <- getChar
    r <- if (x == '\n') IO(Nil)
    else
      for {
        xs <- getLine
      } yield x :: xs
  } yield r

def putStr(s: String): IO[Unit] = s.toCharArray.toList match {
  case Nil => IO(())
  case x :: xs =>
    for {
      _ <- putChar(x)
      _ <- putStr(xs.mkString)
    } yield ()
}

def putStrLn(s: String): IO[Unit] =
  for {
    _ <- putStr(s)
    _ <- putChar('\n')
  } yield ()

def strlen: IO[Unit] =
  for {
    _ <- putStr("Enter a string: ")
    x <- getLine
    _ <- putStr("The string has ")
    _ <- putStr(x.length.toString)
    _ <- putStrLn(" characters")
  } yield ()

def cls = putStr("\033[2J")

type Pos = (Int, Int)

def goto(p: Pos) =
  putStr("\033[" + p._2.toString + ";" + p._1.toString + "H")

def writeat(p: Pos)(s: String): IO[Unit] =
  for {
    _ <- goto(p)
    _ <- putStr(s)
  } yield ()

def seqn[T](seq: List[IO[T]]): IO[Unit] = seq match {
  case Nil => IO(())
  case a :: as =>
    for {
      _ <- a
      _ <- seqn(as)
    } yield ()
}

seqn((1 to 9).map(_.toString charAt 0).map(putChar).toList).unsafeRunSync()