在sml中使用折叠程序

时间:2013-10-22 02:35:43

标签: ocaml sml smlnj

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

有没有办法通过在sml中使用更高阶和/或内置函数来非递归地定义这个函数?我已经尝试了所有我可以但似乎我不会去任何地方。任何想法将不胜感激...

1 个答案:

答案 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)