在SML中使用记录作为函数参数

问题描述 投票:0回答:1

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})。

sml
1个回答
1
投票

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

我不确定你是什么意思。关于SML的标准教科书通常涵盖这一点。例如,ML for the Working Programmer, 2nd Ed.第2章,名称,功能和类型,第28页及其中涵盖了它们。本书以PDF格式免费提供,如果您愿意,可以阅读本章。

如果您阅读第2章,p。 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在这个意义上不处理通用记录,即使技术上可以在一种语言中允许它。也许这不是你想要的意思。也许记录模式是你所需要的。我会让你深入研究教科书材料并解决这个问题。

更新:正如安德烈亚斯罗斯伯格所说,我已经简化了一些例子。

© www.soinside.com 2019 - 2024. All rights reserved.