类型('a - >'b)列表的功能 - > 'a - > '在OCaml中列出

时间:2012-08-15 20:46:43

标签: list types polymorphism ocaml

  

编写任何类型为('a -> 'b) list -> 'a -> 'b list

的Ocaml函数

('a -> 'b) list是让我最困惑的部分。我是OCaml的新手,很难理解如何编写函数来获取特定的数据类型类型。

# let int x = x+1;;
# let fcn = [int; int];;

我可以用这两件事来帮助我,但我仍然对如何将思想转化为代码感到困惑。所以我传递一个函数和一个变量。我将把该变量添加到列表的每个元素并返回列表?

4 个答案:

答案 0 :(得分:6)

('a -> 'b)表示从类型'a到类型'b的函数。基本上你需要创建一个函数,它接受'a并返回'b的函数列表,加上一个特定的'a值,并返回一个'b值列表(可能通过将函数列表的每个函数应用于特定的'a值)。

答案 1 :(得分:4)

由于这是作业,我不会为您提供完整的解决方案。但是,作为一个提示,我建议你看一下熟悉的map函数的实现:

let rec map f = function
  | [] -> []
  | x :: xs -> f x :: map f xs

它具有类型('a -> 'b) -> 'a list -> 'b list,这意味着它将第一个参数作为一个函数,它将某些类型'a的值带到某个类型'b的值,因为它的第二个参数是一个列表类型为'a的元素,并且它生成类型'b的元素列表。它通过参数列表上的模式匹配继续进行,并递归地将函数(f)应用于列表的每个元素x

现在看一下你要编写的函数的类型?它告诉你有关该功能所需的行为?记住map函数的实现,你会如何编写函数?

答案 2 :(得分:2)

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

这意味着您的函数有两个参数

  • ('a -> 'b)的列表,表示将'a类型的元素作为参数并返回类型'b的元素的函数。如您所见,这些类型是抽象的,因此它们可以是任何类型,例如(int -> int)(int -> float)等......
  • 类型'a的元素。请注意,此类型必须与函数的参数相同。

因此,您将使用您提供的元素作为参数构建结果列表。

这是一个小例子:

let action l a =
  let rec todo l res =
    match l with
      | [] -> res
      | h :: t -> todo t res@[h a] in
  todo l []

所以在这里,任何类型int -> int的函数都将被接受。只要你不将它们与其他类型混合,任何其他类型也是如此。

答案 3 :(得分:0)

let rec func f a = match f with          (* ( 'a->'b ) list -> 'a -> 'b list *)
                       |[]->[]
                       |x::lr -> x a :: func lr a;; 

这可能会有所帮助!它工作正常 1 - 众所周知,ocaml逐行创建我们的函数类型

2 - 在此函数中我们有两个参数 f a

3 - ('a->'b)列表:对于 f

4 - 'a :对于 a
! ocaml是怎么做到的? 听!

5 - 当我们将f与[]'空白列表'ocaml版本匹配时,这是一个列表(****)列表但是不知道代码的最后一行包含什么,他会做得好吗?真好!
- 这里我们在代码的最后一行,我们只有f类型列表 -

6 - x :: lr 表示我们对之前匹配的元素的第一个元素进行排序: f 我们添加 a 这里ocaml为 a 提供了一个类型,对于匹配的列表元素: f 作为第一个元素ocaml给出了它们类型从'a 'z 所以这里我们有('a->'b)列表 f a a
- 我们有 f 类型:('a->'b)列表 a 类型:'a

7 - 此功能的结果'b list 所以您可以在评论中回答! :D谢谢