3
fun Dbt (nil,_) =  nil
  | Dbt (x::xs,y::ys) = (x::y)::(Dbt(xs,ys))
  | Dbt (x::xs,nil) = [x]::(Dbt(xs,nil));

有没有办法通过在 sml 中使用高阶和/或内置函数来非递归地定义这个函数?

4

1 回答 1

4

由于您不使用列表而是生成它们,因此您将无法使用通常的列表遍历运算符(map、filter、fold...)。

然而,有一种常见且易于理解的列表生成组合器,即

val unfold : ('a -> ('a * 'b) option) -> 'a -> 'b list

不幸的是,这个运算符在基本的 SML 库中不可用,因此您可能必须自己定义它。

fun Dbt (xs, ys) =
  let fun Step (nil, _) = NONE
      |   Step (x::xs, y::ys) = SOME (x::y,(xs,ys))
      |   Step (x::xs, nil) = SOME ([x], (xs,nil))
  in unfold Step (xs, ys)
于 2013-10-22T07:58:53.773 回答