【问题标题】:Query on type expressions in ML查询 ML 中的类型表达式
【发布时间】:2011-03-16 13:23:50
【问题描述】:

全部,

这是我需要转换为 ML 表达式的类型表达式:

int -> (int*int -> 'a list) -> 'a list

现在我知道这是一个采用 2 个参数的柯里化风格表达式: 第一个参数 = 类型 int 第二个参数 = 函数,它接受前一个 int 值两次并返回任何类型的列表

我很难找到这样一个函数,它需要 int 并返回 'a list

我是 ML 新手,因此这对其他人来说可能是微不足道的,但显然不是我。

非常感谢任何帮助。

【问题讨论】:

  • 我必须补充一点,从类型签名派生 SML 表达式并没有多大意义。类型签名只告诉你故事的一部分。本质上,对于给定的类型,可能有无限多的表达式存在于该类型中。只有当你知道你想要它做什么时,为它指定一个类型才有意义。您使用该组合意图类型来编写实现。例如,签名 'a list -> 'a list 可以是排序函数、反向函数或任何数量的其他事物。它没有告诉你足够的编写函数。

标签: functional-programming types sml


【解决方案1】:

你会得到一个int 和一个函数int*int -> 'a list。你应该返回一个'a list。所以你需要做的就是调用你得到的函数 (x,x) (其中 x 是你得到的 int )并返回结果。所以

fun foo x f = f (x,x)

请注意,这不是int -> (int*int -> 'a list) -> 'a list 类型唯一可能的函数。例如,函数 fun foo x f = f (x, 42)fun foo x f = f (23, x) 也将具有该类型。

编辑:

要使类型完全匹配,请添加类型注释以限制 f 的返回类型:

fun foo x (f : int*int -> 'a list) = f (x,x)

但是请注意,没有真正的理由这样做。此版本的行为与之前的版本完全相同,只是它只接受返回列表的函数。

【讨论】:

  • 你发送的定义有类型; val foo = fn : 'a -> ('a * int -> 'b) -> 'b 。我的问题是一个不带列表的函数如何返回一个列表,这在您上面给出的定义中不会发生
  • @darkie15:你看过编辑吗?新版本与您的类型完全匹配。
  • Okie 刚刚看到编辑。它按照我需要的类型表达式工作。你能告诉我如何根据给定的类型表达式推导出这样的 ML 表达式吗?我希望能够解决给定的任何此类推导。
猜你喜欢
  • 2019-03-19
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多