なんかメモ
ヤック殺人事件。
http://hackage.haskell.org/packages/archive/derp/0.1.5/doc/html/src/Text-Derp.html
parser :: (Ord a) => ParserRec Parser a -> FPValue Bool -> Parser a parser p n = fix $ \ self -> Parser p n (memoFun (deriveImp self)) (compactImp self)
この定義は(ボクにとって)分かりやすいものではないので、もうちょっとはっきりと Mutually Open Recursive っぽくしてみる。
type Open t = t -> t (<+>) :: Open t -> Open t -> Open t l <+> r = \p -> l (r proceeed) compactP :: (Ord a) => Open (Parser a) compactP p = p { parserCompact = compactImpl p } deriveP :: (Ord a) => Open (Parser a) deriveP p = p { parserDerive = deriveImpl p } memoP :: (Ord a) => Open (Parser a) memoP p @ Parser { parserDerive } = p { parserDerive = memoFun parserDerive } simpleP :: (Ord a) => ParserRec Parser a -> FPValue Bool -> Open (Parser a) simpleP r n p = p { parserRec = r, parserNullable = n } parser :: (Ord a) => ParserRec Parser a -> FPValue Bool -> Parser a parser r n = fix $ memoP <+> deriveP <+> compactP <+> (simpleP r n)
かなり長くなったけどこうなる。これを scala にそのまま翻訳すると…
abstract class Parser[A] { def rec : ParserRec[Parser, A] def nullable : FPValue[Bool] def derive(t : Token) : Parser[A] def compact : Parser[A] } abstract class SimpleP[A]( val rec : ParserRec[Parser, A], val nullable : FPValue[Bool] ) extends Parser[A] abstract class CompactP[A]( private val r : ParserRec[Parser, A], private val n : FPValue[Bool] ) extends SimpleP[A](r, n) { def compact : Parser[A] = compactImp this private def compactImp(p : Parser[A]) : Parser[A] = ... } abstract class DeriveP[A]( private val r : ParserRec[Parser, A], private val n : FPValue[Bool] ) extends CompactP[A](r, n) { def derive (t : Token) : Parser[A] = deriveImp(this)(t) private def deriveImp(p : Parser[A]) : Token -> Parser[A] = ... } class MemoP[A]( private val r : ParserRec[Parser, A], private val n : FPValue[Bool] ) extends DeriveP[A](r, n) { override def derive(t : Token) : Parser[A] = ... } def parser[A](r : ParserRec[Parser, A], n : FPValue[Bool]) : Parser[A] = new MemoP(r, n)
長い…直訳すぎて色々無駄があるので自然な定義にする。
abstract class Parser[A] { def rec : ParserRec[Parser, A] def nullable : FPValue[Bool] def derive(t : Token) : Parser[A] def compact : Parser[A] } abstract class CompactP[A] extends Parser[A] { def compact : Parser[A] = compactImp this private def compactImp(p : Parser[A]) : Parser[A] = ... } abstract class DeriveP[A] extends CompactP[A] { def derive (t : Token) : Parser[A] = deriveImp(this)(t) private def deriveImp(p : Parser[A]) : Token -> Parser[A] = ... } abstract class MemoP[A] extends DeriveP[A] { override def derive(t : Token) : Parser[A] = ... } class ConcreateP[A](val rec : ParserRec[Parser, A], val nullable : FPValue[Bool]) extends MemoP[A] def parser[A](r : ParserRec[Parser, A], n : FPValue[Bool]) : Parser[A] = new ConcreateP(r, n)
依然長いけど(ボクにとって)分かりやすくなった。
しかし問題はそこではなくて deriveImp や compactImp なのですが…