Ocaml 在sml中使用折叠过程

Ocaml 在sml中使用折叠过程,ocaml,sml,smlnj,Ocaml,Sml,Smlnj,有没有一种方法可以通过使用sml中的高阶and或内置函数来非递归地定义此函数?我已经尝试了所有我能做的,但似乎我哪儿也不去。任何想法都会得到感谢。由于您不使用列表而是生成它们,您将无法使用通常的列表遍历操作符(映射、筛选、折叠…) 然而,对于列表生成,有一个常见且被广泛理解的组合器,即 fun Dbt (nil,_) = nil | Dbt (x::xs,y::ys) = (x::y)::(Dbt(xs,ys)) | Dbt (x::xs,nil) = [x]::(Dbt(xs,nil

有没有一种方法可以通过使用sml中的高阶and或内置函数来非递归地定义此函数?我已经尝试了所有我能做的,但似乎我哪儿也不去。任何想法都会得到感谢。

由于您不使用列表而是生成它们,您将无法使用通常的列表遍历操作符(映射、筛选、折叠…)

然而,对于列表生成,有一个常见且被广泛理解的组合器,即

fun Dbt (nil,_) =  nil
  | Dbt (x::xs,y::ys) = (x::y)::(Dbt(xs,ys))
  | Dbt (x::xs,nil) = [x]::(Dbt(xs,nil));
不幸的是,这个操作符在基本SML库中不可用,因此您可能需要自己定义它

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

实际上,我想用这个函数来帮助我完成另一个高阶函数的定义,这个高阶函数不应该使用case或递归定义的函数。换句话说,我想在我的“foldr”函数的家庭作业中使用迭代器,是的,我正在试着弄清楚这一点,但是我对let表达式的结构有点困惑。Step到底是什么?它看起来像我的Dbt,你能解释一下吗?
Step
确实包含了
Dbt
的所有有用内容,但它不是递归的。其思想是,它执行“一步”计算,返回列表的下一个元素应该是什么(根据其输入,您可以想象在列表生成过程中转换的状态)。您应该尝试根据我给出的类型签名编写(递归)组合器
展开
,通过将它们组合在一起,您将能够更好地理解
步骤
。您可能不想声明三个名为
步骤
的不同函数,而是声明一个有三种情况的函数(使用
步骤(x::xs…
)。(我会解决这个问题,但显然StackOverflow不会轻易让我这么做。)事实上,对不起,我弄乱了我生锈的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)