Programming languages 执行类型推断的代码

Programming languages 执行类型推断的代码,programming-languages,language-design,type-inference,Programming Languages,Language Design,Type Inference,我正在研究一种具有全局多态类型推断的实验性编程语言 我最近让算法运行得足够好,可以正确地键入我正在使用的示例代码的位。我现在正在寻找一种更复杂的方法来练习边缘情况 有人能告诉我一个我可以用来做这件事的非常粗糙和可怕的代码片段的来源吗?我相信函数式编程世界有很多。我特别想找一些用函数递归做坏事的例子,因为我需要检查以确保函数扩展正确终止,但任何事情都是好的——我需要构建一个测试套件。有什么建议吗 我的语言在很大程度上是强制性的,但任何ML风格的代码都应该易于转换。我的一般策略实际上是从相反的方向处

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

我最近让算法运行得足够好,可以正确地键入我正在使用的示例代码的位。我现在正在寻找一种更复杂的方法来练习边缘情况

有人能告诉我一个我可以用来做这件事的非常粗糙和可怕的代码片段的来源吗?我相信函数式编程世界有很多。我特别想找一些用函数递归做坏事的例子,因为我需要检查以确保函数扩展正确终止,但任何事情都是好的——我需要构建一个测试套件。有什么建议吗


我的语言在很大程度上是强制性的,但任何ML风格的代码都应该易于转换。

我的一般策略实际上是从相反的方向处理它——确保它拒绝不正确的东西

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

热切的定点组合器(不知羞耻地从以下位置偷来):

明显的相互递归:

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'
您可能需要以标准方式实现
map
rev

然后,实际参考资料到处都是(从中窃取):


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

太棒了---谢谢!(虽然我可能需要交回我的“风滚草”徽章。)我的语言是程序性的,而不是功能性的,并且使用了一种变异的CPA而不是Hindley Milner,但我可以适应其中的大部分。如果我可以实现您的地图'和版本'使用语言车,cdr和cons功能,并有它的工作,我会很高兴。唉,我没有高阶函数,但我会努力想办法让它们工作。好吧,就car和cdr而言,map只是
fun map'f l=if l=[]那么[]else cons(f(car l),map'f(cdr l))
。rev'是
fun rev'l=如果l=[],那么[]else追加(rev'(cdr l),cons(car l,nil))
,我猜。大多数情况下,我只关注生成类型检查器应该拒绝的示例!
fun map' f [] = []
  | map' f (h::t) = f h :: map' f t

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

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