愿你走出半生,归来仍是Java Parser
几天前,我的一个朋友给了我一个Haskell问题 Hey, MK,假设我有个BNF,并且我在Haskell中有个这个BNF的parser。 现在,我想给这个BNF改一行,有没有办法不用动这个BNF parser的代码(因为是其他人写的),而是对这parser进行扩展呢? 这问题挺有趣的,也不算难。 这问题说是extensibility problem,其实有两个地方需要扩展。 0:Parser需要用open recursion之类的方法扩展 1:Parse出来的ADT也需要可扩展性 后半个需求见多了,Final Tagless,DTALC,Tree that grow,Recursion scheme style fix。。。于是放下不表,我们来处理前一个。 前半个。。Haskell’s Overlooked Object System就搞过,当然他们有点heavy weight,打算随手弄一个超级轻量级的:5行就够了,多一行是小莎莎。 Ready? data Object x = MkObject (x -> x) 1。Inheritance is not subtyping式的Object=recursive type。为了简易性(反正也不需要多高的扩展性)就不model真。recursive type,而只有recursive dependency。 use :: Object x -> x use (MkObject x) = let res = x res in res 2。3。最典型的tying the knot。其实就是fix了。 我们想想,这个x是什么variant的呢?covariant还是contravariant? inherit :: (a -> b) -> (b -> a) -> Object a -> Object b inherit ab ba (MkObject aa) = MkObject (ab ....