SML类型推断提示 [英] Hint for SML type inference

查看:0
本文介绍了SML类型推断提示的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是SML新手,我正在尝试练习SML类型引用。我正在尝试推断以下类型:

a)fun add42 x =x+42
b)fun comp F G = let fun C x = G(F(x)) in C end
c)fun compA42 x = comp add42 x
d)val foo = compA42 add42
e)fun compCompA42 x = comp compA42 x

我认为前四个问题的解决方案是:

a)int->int
b)(a->b)->(b->c)->a->c
c)(int->a)->int->a
d)int->int

但我对最后一个问题有点困惑。 是否有任何提示可以扣除最后一种类型?

非常感谢。

推荐答案

让我们一步一步手动完成:

fun compCompA42 x = comp compA42 x
  1. 它是一个函数,因此compCompA42具有α -> β类型。
  2. compCompA42的返回值必须与comp compA42 x类型相同,即β = typeof(comp compA42 x)
  3. 我们现在已经是comp的最通用类型:

    (a -> b) -> (b -> c) -> a -> c

现在,我们需要专门针对a -> b = typeof(compA42)(b -> c) = α的情况:

  1. a -> b = typeof(compA42) = (int -> d) -> int -> d。从这个等式可以得出a = int -> db = int -> d

  2. SO、α = b -> c = (int -> d) -> cβ = typeof(comp compA42 x) = a -> c = (int -> d) -> c

  3. 最后,compCompA42最常见的类型是

    α -> β = ((int -> d) -> c) -> (int -> d) -> c


注意,您总是可以让一些SML解释器(例如,smlnj)向您显示类型:

- fun compCompA42 x = comp compA42 x;
val compCompA42 = fn : ((int -> 'a) -> 'b) -> (int -> 'a) -> 'b

与我们手动获取的类型相同(只需将d重命名为'ac重命名为'b)。

这篇关于SML类型推断提示的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆