如何在与Haskell的System-Fw不匹配的类型系统中编程?

Mai*_*tor 2 haskell types type-systems functional-programming

我正在研究λ演算的最佳实现.有一个特定的lambda术语子集是非常有效的.它对应于具有固定点的基本仿射逻辑的类型系统.为了测试我对该算法的实现,我必须在该系统上编写适度复杂的术语.没有基础设施,这很困难.我必须使用无类型的lambda演算,然后手动添加类型; 没有检查,统一,没有类型错误.

一个想法是在Haskell中编写程序 - 从其成熟的类型检查器中获益 - 然后转换为EAL.不幸的是,System-Fw和EAL之间存在不匹配.例如,newtype由于缺少类型级别,您无法在Haskell中表达Scott编码的ADT fix.而且,Haskell是一种复杂的语言,编写Haskell->EAl编译器并不是一件容易的事.

有没有快速/脏的方法来获得该系统的工作类型检查器/推理器/统一器 - 或者至少足够接近 - 而不必自己编程?

Der*_*ins 5

可能最快捷,最简单的方法是将您的系统作为EDSL嵌入到Haskell中.的最后,无标签的方法可能是理想的和有一个编码直线型系统的示例它.特别是,我建议使用Jeff PolakowHOAS变体.这将为您提供如下语法:

*Main> :t eval $ llam $ \x -> add x (int 1)
eval $ llam $ \x -> add x (int 1) :: Int -<> Int
Run Code Online (Sandbox Code Playgroud)

这不太可怕.最终,无标记方法的一个方面是你可以对同一个术语有多种解释,所以你可以有一个解释,将术语翻译成代表EAL的某个AST,或者如果你不是,你可以使用一种解释来执行一些额外的类型检查.能够在Haskell的类型系统中捕获所有这些内容.

  • 综观[在初等仿射逻辑主打字用于演算](http://www.di.unito.it/~ronchi/papers/EA-typingFI.pdf)它看起来像一个普通完全线性演算的一个简单的片段.事实上,它看起来像正好[奥列格定义语言(http://okmij.org/ftp/tagless-final/course/#linear).所以我最后关于做"额外的类型检查"的评论是不必要的.您将完全依赖Haskell的类型错误/推理/统一.不可否认,类型错误消息不是最好的.也许我误解了你的问题? (2认同)