我正在试图弄清楚如何在这个最终无标签EDSL中表达Y-Combitor:
class Symantics exp where
lam :: (exp a -> exp b) -> exp (exp a -> exp b)
app :: exp (exp a -> exp b) -> exp a -> exp b
fix :: ...
fix f = .....
我不确定,但我认为应该可以使用“lam”和“app”来实现Y-Combinator的默认实现。
有人知道吗?我的第一次尝试失败是因为“无法构建无限类型”的东西。
干杯, 京特
答案 0 :(得分:2)
如果您介绍let,则可以提供默认实现。但你不能单独使用lam和app,因为同样的原因你不能直接在Haskell中编写它。这里你的目标是简单输入的lambda演算的扩展,那个术语不会输入。
答案 1 :(得分:2)
正如sclv指出的那样,你需要在语言中引入一个原始的定点形式。想想它是如何在Haskell中定义的:
fix :: (a -> a) -> a
fix f = let x = f x in x
一个合适的'let'绑定表格可以帮助你。 Barendregt第1章和第2章可能就在你的图书馆 - 但我相信它已经绝版(任何人都可以证实吗?)。紧随其后的是http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.46.9283