Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 类型函数(';a->;';b)列表->';a->';OCaml中的b列表_List_Types_Polymorphism_Ocaml - Fatal编程技术网

List 类型函数(';a->;';b)列表->';a->';OCaml中的b列表

List 类型函数(';a->;';b)列表->';a->';OCaml中的b列表,list,types,polymorphism,ocaml,List,Types,Polymorphism,Ocaml,编写类型为('a->'b)list->'a->'b list ('a->'b)列表是我最困惑的部分。我是OCaml新手,很难理解如何编写函数来获取特定的数据类型 # let int x = x+1;; # let fcn = [int; int];; 所以我要传递一个函数,一个函数和一个变量。我将获取该变量并将其添加到列表的每个元素中,然后返回列表?('a->'b)表示从类型'a到类型'b的函数。基本上,您需要创建一个函数,该函数接受一个函数列表,该函数列表接受'a并返回'b,再加上一个特定的

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

('a->'b)列表是我最困惑的部分。我是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
的值转换为某种类型
'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与[]'空白列表'ocaml版本匹配时,该版本是一个列表(***)列表,但不知道代码的最后一行包含什么内容,他会这样做吗?很好
-这里是代码的最后一行,我们只有list类型的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谢谢