编写f函数

问题描述 投票:0回答:1

我目前正在学习CS考试,现在很难理解本书中的练习。练习如下:

使用FOLDR定义,但不使用显式递归,一个函数(分割:‘列表->’a->’一个列表*’一个列表)使split l n返回一对列表。第一个包含l中第一次出现n之前的所有值(以相同的顺序),第二个包含所有其余元素(以相同的顺序)。如果n没有出现在l中,则在第一次出现n之前没有值。示例:split [3; -5; 1; 0; 1; -8; 0; 3] 0 =([[3; -5; 1],[0; 1; -8; 0; 3]),split [ 3; 4; 5] 7 =([],[3; 4; 5])

这是我的教授为解决该练习而编写的代码:

let split l n =
  let f x (l1, l2, b) =
    if x = n then ([], x::(l1@l2), true)
    else if b then (x::l1, l2, b)
    else (l1, x::l2, b)
  in let (l1, l2, b) = foldr f ([], [], false) l in (l1, l2) ;;

我根本不明白第二行(let f x(l1,l2,b))。这些参数如何填充一个值,以便它附带的所有逻辑都有意义?例如:x是什么,如果没有值,如何将其与n比较? b中的这些布尔值是什么意思?

另外,我不理解最后一行中的foldr函数,也没有任何有关它的文档。实际上,即使我的编译器也不了解什么是文件夹,并给我一个错误(Unbound value foldr)。最初,我认为这是List.fold_right的某种缩写,但是如果尝试替换为后者,我仍然会收到错误消息,因为以下参数不正确(文件“ split.ml”,第6行,字符41-56:错误:此表达式的类型为'a *'b *'c但应使用'd list类型的表达式)。

预先感谢您的帮助或建议。

ocaml fold
1个回答
0
投票

D,研究员CS少校在这里。

© www.soinside.com 2019 - 2024. All rights reserved.