0

填写给定的管道骨架,它使用 List.fold_left 来获取 OCaml 函数 val pipe : ('a -> 'a) list -> ('a -> 'a) ,这样pipe [f1;...;fn]f1,...,fn函数在哪里!)返回一个函数f,这样对于任何x,我们都有f x返回结果fn(...(f2(f1 x)))

同样,您的任务是为折叠函数f和基本情况填写适当的值。实现该功能后,您应该在 OCaml 提示符处获得以下行为:

# pipe [] 3;;
- :  int =  3 
# pipe [(fun x -> x+x); (fun x -> x + 3)] 3 ;;
- :  int =  9 
# pipe [(fun x -> x + 3);(fun x-> x + x)] 3;;
- :  int =  12

这是您需要填写的代码:

let pipe fs =
  let f a x = failwith "to be implemented" in
  let base = failwith "to be implemented" in
    List.fold_left f base fs

有人可以帮我弄这个吗?

4

2 回答 2

2

在你给出的骨架中,pipe只接受一个参数。根据 pipe( ('a -> 'a) list -> 'a list) 的类型,您知道该参数具有类型('a -> 'a) list,并且您应该返回某个类型的值('a -> 'a)

现在的类型List.fold_left是形式('b -> 'c -> 'b) -> 'b -> 'c list -> 'b。但你知道:

  1. 它应该返回一个 type 的值'a -> 'a,所以'b将在('a -> 'a)这里实例化

  2. 第三个参数是 类型的('a -> 'a) list,所以'c list会在('a -> 'a) list这里:再次'c将被实例化为('a -> 'a)

您可以得出结论,您将List.fold_left在专业类型上使用(是的,这是一口)

(('a -> 'a) -> ('a -> 'a) -> ('a -> 'a)) -> ('a -> 'a) -> ('a -> 'a) list -> ('a -> 'a)

简而言之:如果管道必须返回一个函数并接受一个函数列表,那么base它本身必须是一个函数,并且f必须接受两个函数并返回一个函数。

应该是哪个功能base?如果是空列表,base则将返回,因此应该具有.fsbasepipe []

应该如何f a x结合两个函数ax,既是类型'a -> 'a,又是返回一个函数'a -> 'a?我会让你在这里想出一个答案。但是您希望拥有以下等式的直觉:

f (管道 [f1; f2]) f3 = 管道 [f1; f2; f3]

(它适用于任何列表,而不仅仅是[f1; f2],但这个例子就足够了)。弄清楚 和 的含义之间的关系pipe [f1; f2]pipe [f1; f2; f3]您将能够定义组合函数f

请注意,您可以从以下不同的框架开始以非常pipe不同的方式编写函数:

let pipe fs x =
  let f a x = failwith "to be implemented" in
  let base = failwith "to be implemented" in
    List.fold_left f base fs

在这种情况下,pipe接受两个参数,一个是 type ('a -> 'a) list,另一个是 type 'a,并且整个返回值应该是 type 'a(一个值,而不是一个函数)。f接受一个函数 ( 'a -> 'a) 和一个值 ( 'a) 并返回一个值,并且base只是一个值(您可以选择哪个?)。

我相信第二种方法稍微简单一点,因为它不那么抽象,但是如果你的老师要求你使用第一个骨架,那可能是因为它会教你关于操作函数的知识,以及构建构建函数的函数。

于 2012-10-26T08:59:28.137 回答
0

你可能想先回答这些问题:

  • 编写一个仅使用基本情况的管道调用示例。
  • 什么时候使用基本情况?
  • 基本案例的类型是什么?
  • 和的更好名称是什么f,即这些变量的作用是什么?ax
于 2012-10-26T08:54:58.777 回答