Функция SML в списке записей - PullRequest
4 голосов
/ 03 января 2012

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

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

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

1 Ответ

6 голосов
/ 03 января 2012

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

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 *)
...