programming-languages - 执行类型推断的代码

标签 programming-languages language-design type-inference

我正在开发一种具有全局多态类型推断的实验性编程语言。

我最近让算法运行得足够好,可以正确输入我扔给它的示例代码。我现在正在寻找更复杂的东西来处理边缘情况。

任何人都可以向我指出可以用于此目的的非常粗糙和可怕的代码片段的来源吗?我确信函数式编程世界里有很多这样的东西。我特别寻找用函数递归做坏事的例子,因为我需要检查以确保函数扩展正确终止,但一切都很好——我需要构建一个测试套件。有什么建议吗?

我的语言很大程度上是命令式的,但任何 ML 风格的代码都应该很容易转换。

最佳答案

我的总体策略实际上是从相反的方向接近它 - 确保它拒绝不正确的东西!

也就是说,这里是我通常使用的一些标准“确认”测试:

急切的固定点组合器(无耻地从 here 窃取):

datatype 'a t = T of 'a t -> 'a

val y = fn f => (fn (T x) => (f (fn a => x (T x) a)))
               (T (fn (T x) => (f (fn a => x (T x) a))))

明显的相互递归:

fun f x = g (f x)
and g x = f (g x)

也检查一下那些深层嵌套的 let 表达式:

val a = let
   val b = let 
      val c = let
         val d = let
            val e = let
               val f = let
                  val g = let
                     val h = fn x => x + 1
                  in h end
               in g end
            in f end
         in e end
      in d end
   in c end
in b end

深度嵌套的高阶函数!

fun f g h i j k l m n = 
   fn x => fn y => fn z => x o g o h o i o j o k o l o m o n o x o y o z

我不知道是否必须有值限制才能合并可变引用。如果是这样,看看会发生什么:

fun map' f [] = []
  | map' f (h::t) = f h :: map' f t

fun rev' [] = []
  | rev' (h::t) = rev' t @ [h]

val x = map' rev'

您可能需要以标准方式实现 maprev :)

然后使用周围的实际引用文献(从 here 窃取):

val stack =
let val stk = ref [] in
  {push = fn x => stk := x :: !stk,
   pop  = fn () => stk := tl (!stk),
   top  = fn () => hd (!stk)}
end

希望这些能在某种程度上有所帮助。确保尝试构建一组可以以某种自动方式重新运行的回归测试,以确保所有类型推断在您所做的所有更改中都能正确运行:)

关于programming-languages - 执行类型推断的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3440304/

相关文章:

programming-languages - 精通一门编程语言意味着什么?

c# - 哪种语言习语/范式/特性使得添加对 "type providers"的支持变得困难?

programming-languages - 为什么 C/C++/C#/Java 等命令式或 OO 语言中不存在交换/交换运算符?

javascript - JavaScript 中 'this' 关键字行为的基本原理是什么?

c# - 继承时的表达式推断

java - 如何将调用静态导入的泛型方法的结果传递给另一个方法?

java - Java View 中的 C++ : I must have missed a few things

c# - 编码指南+最佳实践?

makefile - Makefile 如何知道文件发生更改并重新编译它?

haskell - Haskell 如何推断 (+).(+) 的类型