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}
有所不同)。
答案 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
但是,如果您尝试定义一个从任意记录中提取x
和y
而不指定其余记录类型的记录,
- 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所建议的那样,我对示例进行了一些简化。