在SML中将记录用作函数参数

时间:2019-02-25 12:48:27

标签: sml

SML中一个不太引起关注的主题是“记录”。

我想知道如何处理函数中的记录(作为自变量或取整值)。我知道我们可以使用#运算符来获取记录的元素。但是我应该如何将记录传递给函数?有特殊的模式匹配吗?

我尝试过:

fun foo r = #1 r;

它以以下错误结尾:

Error: unresolved flex record
(can't tell what fields there are besides #1)

我没有找到任何在线的SML指南来解释这部分记录。

我也尝试过:

fun foo {1=2,2=3} = 5;

发现元组实际上是记录的语法糖。当然,我收到了match警告,但至少这次是有效的。真正的问题是如何处理“通用”记录。可能有助于查看一些示例或对该主题的指南的引用。

再看看有关这些函数签名的说明会更有帮助(正如我提到的{1=2,2=3}之类的记录会比{a=2,b=3}有所不同)。

1 个答案:

答案 0 :(得分:1)

  

SML中一个不太引起关注的主题是“记录”。

我不确定您的意思。有关SML的标准教科书通常会对此进行介绍。例如,ML for the Working Programmer, 2nd Ed.第2章,名称,函数和类型,第28页及其后的内容。本书以PDF格式免费提供,因此您可以根据需要阅读本章。

如果您阅读第2章,请参见34涵盖了记录模式

- val richardIII =
      { name = "Richard III"
      , born = 1452
      , crowned = 1483
      , died = 1485
      , quote = "Plots have I laid..."
      };

> val richardIII =
      {born = 1452, crowned = 1483, died = 1485, name = "Richard III",
       quote = "Plots have I laid..."} :
  {born : int, crowned : int, died : int, name : string, quote : string}

- val { name = richard_name, died = richard_died, ... } = richardIII;
> val richard_name = "Richard III" : string
  val richard_died = 1485 : int

这些记录模式也可以在函数参数中使用。

我建议您阅读一本有关SML的教科书。

StackOverflow是一种无法复制的格式。

  

真正的问题是如何处理“通用”记录

取决于您所说的通用记录的含义,SML可能无法做到这一点。

例如,您可以定义函数

- fun f { x, y } = x + y;
> val f = fn : {x : int, y : int} -> int

但是,如果您尝试定义一个从任意记录中提取xy而不指定其余记录类型的记录,

- fun f { x, y, ... } = x + y;
! Toplevel input:
! fun f { x, y, ... } = x + y;
!       ^^^^^^^^^^^^^
! Unresolved record pattern

如果您指定了记录类型,

- fun f ({ x, y, ... } : { x : int, y : int, z : int }) = x + y;
> val f = fn : {x : int, y : int, z : int} -> int

或等效地通过类型别名

- type coord = { x : int, y : int, z : int };
> type coord = {x : int, y : int, z : int}
- fun f ({ x, y, ... } : coord) = x + y;
> val f = fn : {x : int, y : int, z : int} -> int

然后就像使用#x#y一样好:

- fun f (coord : coord) = #x coord + #y coord;
> val f = fn : {x : int, y : int, z : int} -> int

并且没有任何类型的注释或推断,这也将无法识别特定的记录类型:

- fun f coord = #x coord + #y coord;
! Toplevel input:
! fun f coord = #x coord + #y coord;
!               ^^
! Unresolved record pattern

因此,即使从技术上讲,使用语言允许这样做,SML也不以这种方式处理通用记录。也许这不是您想要的意思。也许记录模式正是您所需要的。我将让您深入研究教材并加以解决。

更新:正如Andreas Rossberg所建议的那样,我对示例进行了一些简化。