繁体   English   中英

OCaml 中类型 ('a -> 'b) list -> 'a -> 'b list 的函数

[英]Function of type ('a -> 'b) list -> 'a -> 'b list in OCaml

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

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

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

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

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

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

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

它有类型('a -> 'b) -> 'a list -> 'b list这意味着它需要一个函数作为它的第一个参数,该函数将某种类型'a'a的值转换为某种类型'b'b ,作为它的第二个参数是一个类型为'a的元素列表,它产生一个类型为'b的元素列表。 它通过对参数列表进行模式匹配,然后将函数 ( f ) 递归地应用于列表的每个元素x

现在看看你要写的函数的类型? 它告诉您有关该功能所需行为的什么信息? 牢记map函数的实现,您将如何编写您的函数?

('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函数都将被接受。 只要不将它们与其他类型混合,任何其他类型也是如此。

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 版本匹配时,它是一个列表(****) 列表但不知道代码的最后一行中包含什么,他会做吗? 好的 !
- 这里我们在代码的最后一行,我们只有 f 类型的列表 -

6 - x :: lr意味着我们对之前匹配的元素的第一个元素进行排序 : f并且我们此处添加一个ocaml 为a和匹配的列表元素提供类型: f作为第一个元素'一个'Z所以在这里,我们有(' A - >' b)名单f“一
- 这里我们有f类型: ('a->'b) list ,和a类型: 'a

7 -此函数的结果'b list所以由您在评论中回答! :D 谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM