プログラミングhaskell 8章 version scala 〜後半〜
前半はこちら
def token[T](p: Parser[T]): Parser[T] = for { _ <- space v <- p _ <- space } yield v def identifier: Parser[String] = token(ident) def natural: Parser[Int] = token(nat) def symbol(s: String): Parser[String] = token(string(s)) println((for { _ <- symbol("[") n <- natural nx <- many(for { _ <- symbol(",") lr <- natural } yield lr) _ <- symbol("]") } yield n :: nx).run(" [ 1, 2, 3,4, 5 ]")) def expr: Parser[Int] = for { t <- term r <- (for { _ <- symbol("+") e <- expr } yield t + e) +++ (for { _ <- symbol("-") e <- expr } yield t - e) +++ pure(t) } yield r def term: Parser[Int] = for { f <- factor r <- (for { _ <- symbol("*") t <- term } yield f * t) +++ (for { _ <- symbol("/") t <- term } yield f / t) +++ pure(f) } yield r def factor: Parser[Int] = (for { _ <- symbol("(") e <- expr _ <- symbol(")") } yield e) +++ natural def eval(s: String): Int = expr.run(s).map(_._2).get println(eval("2*3+4")) println(eval("2*(3+4)")) println(eval("(1 + 2) * (7 - 2) / 5"))