Sml 用于用户定义的通用列表的映射函数

Sml 用于用户定义的通用列表的映射函数,sml,ml,Sml,Ml,我试图用两个值构造函数定义一个新的多态类型generic_list,list和Seq,并添加映射所有项的函数map_函数(proc,items) 以下是我到目前为止的情况: datatype 'a seq = Nil | Cons of 'a * (unit -> 'a seq); datatype 'a generic_list = List of 'a list | Seq of 'a seq; 如何构建map\u函数 当我有以下要求时: 签名:generic\u映射(过程、项目)

我试图用两个值构造函数定义一个新的多态类型
generic_list
list
Seq
,并添加映射所有项的函数
map_函数(proc,items)

以下是我到目前为止的情况:

datatype 'a seq = Nil | Cons of 'a * (unit -> 'a seq);
datatype 'a generic_list = List of 'a list | Seq of 'a seq;
如何构建
map\u函数
当我有以下要求时:

  • 签名:
    generic\u映射(过程、项目)
  • 用途:与类中定义的
    map
    相同,但项可以是常规列表或惰性列表
  • 类型:
    fn:('a->'b)*'a generic\u list->'b generic\u 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
    
我猜在类中定义的
map
您指的是用于列表的
map
函数?无论如何,您的数据类型有两个构造函数,一个用于
List
s,一个用于
Seq
s,因此在顶层,您的函数应该只区分这两种情况,即

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


当空序列由
Seq(fn()=>NONE)

编码时,我认为在第一个示例中,结果应该是
List[11,12,13]
datatype 'a seq = Seq of unit -> ('a * 'a seq) option;