【问题标题】:SML: Interpret function from its typeSML:从类型解释函数
【发布时间】:2017-11-24 22:35:19
【问题描述】:

我是 SML(元语言)的新手。 谁能告诉我如何从下面给出的类型派生函数: ('a -> 'b) -> ('b 列表 -> 'c) -> 'a -> 'c 列表

我很难理解 SML 中的柯里化函数。

【问题讨论】:

  • 你能澄清一下这个问题吗?具有这种类型的函数数不胜数。你不能给出一个类型然后说“给出具有这种类型的函数”。它们的数量是无限的。不过,走另一条路是可行的。如果你用 SML 写一个函数,那么你可以计算它的类型。也许您正在寻找该类型的 a 函数?你问的是这个吗?
  • 嗨@RayToal,确实是的。它可以是任何函数,只要它满足这种类型。另外,如果你能解释一下如何从它的类型中推断出函数,那就太好了。
  • 我可以看到有三种不同的类型: 'a 'b 'c 我可以这样写: fun foo a b c = b [a c];这不正确,但可能是这样的?
  • 是的,非常接近(从下面的答案中可以看出)。伟大的开始!

标签: sml smlnj


【解决方案1】:

这会起作用

- fun f g h x = [h [g x]];
> val ('a, 'b, 'c) f = fn : ('a -> 'b) -> ('b list -> 'c) -> 'a -> 'c list

我是这样做的。

我们被赋予了类型

('a -> 'b) -> ('b list -> 'c) -> 'a -> 'c list

所以我们知道我们想要一个带有三个咖喱参数的函数,前两个是函数,第三个是任何东西。所以我们写:

fun f g h x = ....

现在第一个参数是一个函数,它接受'a 类型的东西,x 是所以我们想要一个

g x

在右手边。那将是'b 类型。现在h 接受'b list,所以我们可以写

h [g x]

这会产生一个'c 类型的值,但我们希望f 返回一个'c list,所以我们只是将它放在一个列表中,所以我们得到:

fun f g h x = [h [g x]];

【讨论】:

    猜你喜欢
    • 2016-03-19
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 2018-01-11
    • 1970-01-01
    相关资源
    最近更新 更多