0

generic_list2 つの値コンストラクター (Listと) を使用して新しいポリモーフィック型を定義し、すべてのアイテムにマップSeqする関数を追加しようとしています。map_function (proc, items)proc

これが私がこれまでに持っているものです:

datatype 'a seq = Nil | Cons of 'a * (unit -> 'a seq);
datatype 'a generic_list = List of 'a list | Seq of 'a seq;

map_function 次の要件がある場合、どのようにビルドできますか。

  • サイン:generic_map (proc, items)
  • 目的: クラスで定義されているものと同じmapですが、項目は通常のリストまたは遅延リストのいずれかです。
  • タイプ:fn: ('a -> 'b) * 'a generic_list -> 'b generic_list
  • 例:

    generic_map (fn x => x + 10, List [1, 2, 3]);
    val it = List [12,13,14]: int generic_list
    
    generic_map (fn x => x + 10, Seq (Cons (1, fn () => Cons(2, fn () => Cons (3, fn () => Nil)))));
    val it = Seq (Cons (11, fn)): int generic_list
    
4

1 に答える 1

1

mapクラスで定義されているとは、 Standard ML Basis Librarymapのリストの関数を意味していると思いますか? とにかく、 s 用と s用の 2 つのコンストラクターを持つデータ型があるため、トップレベルでは、関数はこれら 2 つのケースを区別する必要があります。つまり、ListSeq

fun generic_map (f, List xs) = List (...) (*map f over xs*)
  | generic_map (f, Seq s)   = Seq (...) (*map f over s*)

最初のケースでは、 を使用して必要なものをほぼ無料で入手できますList.map。あとは、遅延リストのマップ関数を定義するだけです。その形状は次のようになります。

fun map_seq (f, Nil) = ... (*map f over the empty sequence*)
  | map_seq (f, Cons (x, s)) = ... (*map f over x and the remaining sequence s*)

注意:これは仕様の一部であるため、変更することは許可されていない可能性があります (好みの問題かもしれません)。ただし、遅延リストのタイプは少し奇妙です。 、あなたの場合、遅延リストと同じ型を持っていません(つまり、リストの先頭は遅延アクセスされません)。同様の状況では、むしろ使用します

datatype 'a cell = Nil | Cons of 'a * (unit -> 'a cell);
type 'a seq = (unit -> 'a cell);

また

datatype 'a seq = Seq of unit -> ('a * 'a seq) option;

ここで、空のシーケンスは によってエンコードされSeq (fn () => NONE)ます。

于 2013-06-10T01:30:01.253 に答える