fun Dbt (nil,_) = nil
| Dbt (x::xs,y::ys) = (x::y)::(Dbt(xs,ys))
| Dbt (x::xs,nil) = [x]::(Dbt(xs,nil));
有没有办法通过在sml中使用更高阶和/或内置函数来非递归地定义这个函数?我已经尝试了所有我可以但似乎我不会去任何地方。任何想法将不胜感激...
答案 0 :(得分: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)