2012-10-26 60 views
1

在管给出的骨架,它使用List.fold_left得到一个OCaml的功能填写 val pipe : ('a -> 'a) list -> ('a -> 'a) 这样pipe [f1;...;fn](其中f1,...,fn的功能!)返回一个函数f这样,对于任何x,我们有f x返回结果fn(...(f2(f1 x)))ocaml的函数调用List.fold_left

同样,您的任务是为折叠功能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 

有人可以帮助我?

+0

我认为通常的作业规则是你应该显示一些你已经尝试过的代码。没有什么可以评论的,没有解决问题就很难提供帮助。 – jrouquie

+0

以及我认为它的基地应该让基地= 0,但我不知道f部分。我将如何做到这一点。 –

回答

0

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

  • 写管道调用其中仅使用基本情况的一个例子。
  • 何时使用基本情况?
  • 基本情况是什么类型?
  • 什么是f,ax的更好名称,即这些变量的作用是什么?
2

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

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

  1. 它应该返回'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是?如果fs是空列表,则会返回base,因此base应该具有预期的行为pipe []

应该如何f a x结合了这两种功能ax,既'a -> 'a类型,并返回一个单一的功能'a -> 'a?我会让你在这里想出一个答案。但是你想拥有以下等式的直觉:

f(pipe [f1; f2])f3 = pipe [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需要两个参数,('a -> 'a) list类型和其他的一个的类型'a,并且整个返回值应该是'a(一个值,而不是一个函数)类型。 f需要一个函数('a -> 'a)和一个值('a)并返回一个值,并且base只是一个值(您可以选择哪一个?)。

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

+0

设管FS = 令F一X = A在 设基地+ X = O在 List.fold_left F基础FS –

+0

这个编译罚款,但它是错的测试过程中,我在做什么错? –

+0

你写的东西没有意义。为什么你甚至会在一个多态函数中使用加法,该函数应该适用于任何数据类型''a',而不仅仅是整数? – gasche