2012-01-03 4 views
4

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

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

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

Я думаю, что я только что понял свою ошибку: судя по всему, вы должны переобъявить лейбл в аргумент, как в '{id = ID, privateStack = x :: xs}', иначе я предполагаю, что он рассматривает их как конструкторы. – itchy23

ответ

6

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^