编写任何类型为
的Ocaml函数('a -> 'b) list -> 'a -> 'b list
('a -> 'b) list
是让我最困惑的部分。我是OCaml的新手,很难理解如何编写函数来获取特定的数据类型类型。
# let int x = x+1;;
# let fcn = [int; int];;
我可以用这两件事来帮助我,但我仍然对如何将思想转化为代码感到困惑。所以我传递一个函数和一个变量。我将把该变量添加到列表的每个元素并返回列表?
答案 0 :(得分:6)
('a -> 'b)
表示从类型'a
到类型'b
的函数。基本上你需要创建一个函数,它接受'a
并返回'b
的函数列表,加上一个特定的'a
值,并返回一个'b
值列表(可能通过将函数列表的每个函数应用于特定的'a
值)。
答案 1 :(得分:4)
由于这是作业,我不会为您提供完整的解决方案。但是,作为一个提示,我建议你看一下熟悉的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
函数的实现,你会如何编写函数?
答案 2 :(得分:2)
('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
的函数都将被接受。只要你不将它们与其他类型混合,任何其他类型也是如此。
答案 3 :(得分: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 - 在此函数中我们有两个参数 f 和 a
3 - ('a->'b)列表:对于 f
4 - 'a :对于 a
! ocaml是怎么做到的? 听!
5 - 当我们将f与[]'空白列表'ocaml版本匹配时,这是一个列表(****)列表但是不知道代码的最后一行包含什么,他会做得好吗?真好!
- 这里我们在代码的最后一行,我们只有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谢谢