プログラミング言語 Standard ML 入門 (問題の解答例)
8 参照型

8.2 履歴に依存するプログラム

問 8.4

toString を書き,gensym を完成させよ.

解答例 

   fun toString L = implode (map chr (rev L))
問 8.5

上記のプログラムを一般化し,異なる文字のリストを受け取り,この文字を 使って識別名を生成する関数を返す関数 makeGensym  : char list -> unit -> string を定義せよ. ただし,文字列は,与えられたリストの順によって決まる文字の大小関係 から導かれる順序とする. たとえば,makeGensym [#"S",#"M",#"L"]で生成される関数は, "S","SS","SM","SL","MS","MM","ML","LS", のような文字列の系列を生成するものとする.

解答例 

   fun makeGenSym L =
     let val seed = ref [0]
         fun next nil = [0]
           | next (h::t) = if h = (length L - 1) then 0::(next t) else (h+1)::t
         fun toString s = implode (map (fn x => List.nth (L,x)) (rev s))
     in
        fn () => toString (!seed) before seed := next (!seed)
     end