在these對DSL的無標籤的最終解釋很酷的註釋部分2.3,奧列格Kiselyov展示瞭如何解決解析問題的一個序列化的DSL表達式一次,解釋它多次。拷貝機解釋與高階像差
簡單地說,他表示「假一流多態性」的同類型
newtype Wrapped = Wrapped (∀ repr. ExpSYM repr ⇒ repr)
fromTree :: String → Either ErrMsg Wrapped
並不令人滿意,因爲它是不可擴展的:我們必須對每設置的不同Wrapper
/fromTree
限制repr
。因此,我傾向於使用他的解決方案複製解釋器。這個問題是關於如何在HOAS中使用該解釋器。
具體而言,考慮目標語言綁定以下語言:
class Lam repr where
lam :: (repr a -> repr b) -> repr (a -> b)
app :: repr (a -> b) -> repr a -> repr b
我無法給Lam
類的聲音例如我的複印機解釋。下面是我有:
data Dup repr1 repr2 a = Dup {unDupA :: repr1 a, unDupB :: repr2 a}
instance (Lam repr1, Lam repr2) => Lam (Dup repr1 repr2) where
lam f = Dup (lam $ unDupA . f . flip Dup undefined) (lam $ unDupB . f . Dup undefined)
app (Dup fa fb) (Dup a b) = Dup (app fa a) (app fb b)
是否有某種方式來給出一個Lambda
遞歸例如的東西,像我Dup
型,不涉及undefined
?
我也利用this paper,允許單子口譯與人道主義組織和機構的lam
的更強大的版本,但我沒有看到它如何幫助我的實例Dup
嘗試。使用HOAS版本lam
的解決方案將會非常棒!
*:奧列格展示瞭如何使用定義德布魯因指數健全的情況下,但我在高階像差的解決方案很感興趣。
class Lam repr where lam :: repr (a,g) b -> repr g (a -> b) app :: repr g (a->b) -> repr g a -> repr g b data Dup repr1 repr2 g a = Dup{d1:: repr1 g a, d2:: repr2 g a} instance (Lam repr1, Lam repr2) => Lam (Dup repr1 repr2) where lam (Dup e1 e2) = Dup (lam e1) (lam e2) app (Dup f1 f2) (Dup x1 x2) = Dup (app f1 x1) (app f2 x2)
這似乎不太可能。你不能從'(r1,r2) - >(r1,r2)'到'(r1 - > r1,r2 - > r2)'獲得,這將需要實現'Lam(Dup r1 r2)' '(Lam r1,Lam r2)'。 –
@ Li-yaoXia對於任意一個「Monad m」,我認爲從一個'(a - > m b) - > m(a - > b)'是一樣的,直到我讀到第二個鏈接的紙。我支持另一個類似的驚人的解決方案。 – crockeea
@crockeea是一種可以在論文的上下文之外描述的「訣竅」,或者我可以跳到某個頁面以便快速瞭解該如何工作? – jberryman