2012-01-03 21 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 *) 

となります。

上記のパターンマッチングが網羅されていないことに注意、privateStackためplayersと空のリストについては、空のリストの点に注意してください。どうやらあなたは、レコードのラベルを再宣言する必要があります。

fun foo([], ...) = (* do something *) 
    | foo({id = id, privateStack = []}::players, ...) = (* do something else *) 
    | foo({id = id, privateStack = x::xs}::players, ...) = (* do something else *) 
関連する問題