Функция SML в списке записей

Я пытаюсь объявить функцию, которая принимает в качестве аргумента список записей внутри кортежа, но синтаксис не такой интуитивно понятный, как мне хотелось бы.

Вот что я пытаюсь сделать:

type Player = {id:int, privateStack:int list};
fun foo(({id, x::xs}:Player)::players, ...) = (* wrong syntax *)
    (* do something *)

person itchy23    schedule 03.01.2012    source источник
comment
Думаю, я только что осознал свою ошибку: по-видимому, вам нужно повторно объявить метки записей в аргументе, как в {id=ID, privateStack=x::xs}, иначе, я думаю, он будет рассматривать их как конструкторы.   -  person itchy23    schedule 03.01.2012


Ответы (1)


Сопоставление с образцом требует привязки полей записи к некоторым значениям, поэтому необходимо использовать явный синтаксис записи. Следовательно,

fun foo(({id = id, privateStack = x::xs})::players, ...) =
    (* do something *)

должно сработать.

Обратите внимание, что приведенное выше сопоставление с образцом не является исчерпывающим, обратите внимание на пустой список для players и пустой список для privateStack:

fun foo([], ...) = (* do something *)
   | foo({id = id, privateStack = []}::players, ...) = (* do something else *)
   | foo({id = id, privateStack = x::xs}::players, ...) = (* do something else *)
person pad    schedule 03.01.2012