我有以下语法代表Haskell中的简单类型的lambda演算(STLC)。我在文献中看到了很多有关如何生成随机lambda项的论文,但我想知道Haskell中是否有任何库可以根据下面的语法生成随机实例?我只想生成一次程序。
我看到了一个名为QuickCheck的库,但是可以用于此目的吗?
data Vtype = Tint
| Tbool
| Tfun Vtype Vtype
deriving (Eq, Data)
data Expr = Vi Int
| Vb Bool
| Vv Name
| App Expr Expr
| Lam Vtype Name Expr
deriving (Eq, Data)
我的第二个问题是,我知道对于Java和Python这样的语言有许多基准,但是我尝试为lambda演算寻找类似的东西,但找不到任何东西。有没有机会获得STLC或未类型化lambda演算的基准?
答案 0 :(得分:2)
我真的不知道您可以重用一个库。该库可能还会使您陷入一种特殊的绑定构造方法中,例如De Bruijn,Names,(P)HOAS或bound
。
但是我知道Haskell中的一种实现确实会随机生成紧密且类型正确的术语:https://github.com/Gabriel439/Haskell-Morte-Library/blob/3c61df86985a7ccf97fe0765deac73f06b12c476/test/ClosedWellTyped.hs#L38
也许这足以让您滚动?
答案 1 :(得分:1)
是的,您需要的是QuickCheck库。
首先,我假设Name
是String
的类型同义词?
当然,在STLC中生成lambda项会带来一个特殊的问题。
快速检查使您可以在Gen
Monad中生成术语,从而可以合成术语。类型的默认Gen
可以通过使类型类为Arbitrary
的类型实例来声明。也就是说,一旦有了嵌套类型的生成器,就可以使用它来使用它创建值构造器的生成器。
举个例子,我们可以为lambda抽象编写一个生成器,它使用类型为Tint
的参数x或y,并返回一个Bool(假设您已经编写了生成器boolExpr
),如下所示: :
intLambda :: Gen Expr
intLambda = Lam Tint <$> elements ["x","y"] <*> (boolExpr :: Gen Expr)
(请注意,我使用的是Appationative Notation,在此Monad中通常更优雅)。
Gen
模块是the hackage documentation的一个很好的起点。许多QuickChecks模块特别适合执行测试,这似乎并不是您的主要考虑。