fun Dbt (nil,_) = nil
| Dbt (x::xs,y::ys) = (x::y)::(Dbt(xs,ys))
| Dbt (x::xs,nil) = [x]::(Dbt(xs,nil));
有没有办法通过在 sml 中使用高阶和/或内置函数来非递归地定义这个函数?
由于您不使用列表而是生成它们,因此您将无法使用通常的列表遍历运算符(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)