【问题标题】:SML type inference by hand手动 SML 类型推断
【发布时间】:2017-09-04 21:27:07
【问题描述】:

你好,我正在为我的期末考试做准备,考试中总是有 ml 类型推断。 即我们被要求写出这样一个函数的类型:

fun ugh x y z = x z (y z);
val ugh = fn : ('a -> 'b -> 'c) -> ('a -> 'b) -> 'a -> 'c

fun doh x y z = z (x y ) (y + 1);
val doh = fn : (int -> 'a) -> int -> ('a -> int -> 'b) -> 'b

然而,我试图推断类型的所有方法总是出错。 虽然网上有例子,但没有类似功能的例子。 有没有办法按照一些指导方针来组成类型? 如果适用于第一个示例,该指南将是最好的。

【问题讨论】:

    标签: sml type-inference


    【解决方案1】:

    是的,StackOverflow 上有几个手动类型推断的示例:12345、...

    1. 要推断fun ugh x y z = x z (y z) 的类型,你可以这样说开始

      val ugh : 'a -> 'b -> 'c -> 'd
      

      因为它需要三个咖喱参数。还可以看到x : 'a是两个柯里化参数的函数,y : 'b是一个参数的函数,而'd应该完全用'a'b'c来表示.

      所以对于y 的类型,设置'b = 'c -> 'e,因为它接受z : 'c 作为输入并返回一些我们还没有得到的类型。

      对于x 的类型,设置'a = 'c -> 'e -> 'f,因为它将z : 'cy 的输出作为输入并返回一些我们还没有得到的类型。

      替换那些,根据需要添加括号,你得到

      val ugh : ('c -> 'e -> 'f) -> ('c -> 'e) -> 'c -> 'f
      

      此时您可能想要重命名它们以便获得

      val ugh : ('a -> 'b -> 'c) -> ('a -> 'b) -> 'a -> 'c
      

      但你真的不必这样做。

      这里我唯一需要考虑的是x 的类型取决于y 的类型,所以我想先确定这一点。


    1. 要推断fun doh x y z = z (x y) (y + 1) 的类型,您可以类似地这样开头

      val doh : 'a -> 'b -> 'c -> 'd
      

      因为它也需要三个咖喱参数。最容易设置'b = int,和第一个例子类似,你可以设置'a = int -> 'e然后'c = 'e -> int -> 'd

      替换那些,根据需要添加括号,你得到

      val doh : (int -> 'e) -> int -> ('e -> int -> 'd) -> 'd
      

      或稍微重命名后

      val doh : (int -> 'a) -> int -> ('a -> int -> 'b) -> 'b
      

    【讨论】:

    • 设置 'c = int 和 'b int -> 'e 的方式应该是: val doh : ('e -> int -> 'd) -> (int -> ' e) -> int -> 'd 。更让我烦恼的是这些类型的正确顺序。从左到右,我们是否将参数按出现在函数左侧的顺序排列,这意味着 x->y->z->doh ?
    • 加上编译器为 doh 提供了这种类型: (int -> 'a) -> int -> ('a -> int -> 'b) -> 'b
    • 您在最后一个结果中交换了 'a'c 替换的位置。
    • @Akismpa:你可以试试它们出现在屏幕上的顺序。但是,在第一个示例中,函数x 将函数y 的输出作为输入,并且由于我还没有将y 的类型表示为从一种类型到另一种类型的函数,所以我不能就这一点而言,很容易扩展x 的类型。所以我把x 搁置起来,开始推断y。您最终可能会得到相互依赖或足够大的示例,严格遵循类型推断算法将是有益的。但只要你能在脑海中记住变量,对我来说似乎没有必要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    相关资源
    最近更新 更多