2

编写任何类型为的 Ocaml 函数('a -> 'b) list -> 'a -> 'b list

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

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

所以我传递一个函数一个函数和一个变量。我要将该变量添加到列表的每个元素并返回列表?

4

4 回答 4

6

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

于 2012-08-15T20:53:54.837 回答
4

As this is homework, I will not provide you with a complete solution. But, as a hint, I would suggest that you take a look at this implementation of the familiar map function:

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

It has type ('a -> 'b) -> 'a list -> 'b list which means that it takes as its first argument a function that takes values of some type 'a to values of some type 'b, as its second argument a list of elements of type 'a, and that it produces a list of elements of type 'b. It proceeds by pattern matching on the argument list and, recursively applying the function (f) to every element x of the list.

Now have a look at the type of the function that you have to write? What does it tell you about the required behaviour of that function? Keeping the implementation of the map function in mind, how would you write your function?

于 2012-08-15T23:03:43.243 回答
2
('a -> 'b) list -> 'a -> 'b list

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

  • 其中的列表('a -> 'b)表示一个函数,该函数将 type 的元素'a作为参数并返回 type 的元素'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将被接受。只要您不将它们与其他类型混合,任何其他类型也一样。

于 2012-08-19T21:19:53.880 回答
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 -在这个函数中,我们有两个参数fa

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

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

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

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

7 -这个函数的结果'b list所以你可以在评论中回答!:D 谢谢

于 2017-12-31T10:41:53.653 回答