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-在这个函数中,我们有两个参数f和a
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谢谢