![](/img/trans.png)
[英]Function to flatten `('a list * b' list) list` to `'a list* 'b list` in OCaml
[英]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 -在这个函数中我们有两个参数f和a
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.