# let rec map1 f l = match l with
[]->[]
|h::t -> f h::map1 f t;;
val map1 : ('a -> 'b) -> 'a list -> 'b list = <fun>
我是OCaml的新手,我有两个问题:
h :: map1 f t
之前有一个f? f应该是map1
函数中的参数。为什么这本书的例子单独写出来?('a -> 'b) -> 'a list -> 'b list = <fun>
为什么有一个b列表?
该书解释说,b列表是函数f
的结果,列表是函数f
的参数。但是,为什么以下示例中没有a
,b
列表?它还有一个函数f
,它还将f
分别放在第三行。
# let rec apply f n x=
if n = 0 then x
else f ( apply f (n-1) x);;
val apply : ('a -> 'a) -> int -> 'a -> 'a = <fun>
答案 0 :(得分:4)
|h::t -> f h::map1 f t
Ocaml语法的优先规则意味着上面的match子句被解析为
|h::t -> (f h)::(map1 f t)
当然f h
是将函数f
应用于参数h
简而言之,当列表l
与模式h::t
匹配时(l
是头h
和尾t
)的正确列表,一对制作 ::
(或构建或构建)头f h
和尾map1 f t
典型的用法是首先使用从整数到字符串的函数:
let nextasstr n = Printf.sprintf "(%d)" (n+1);;
所以nextasstr 2
是没有引号的字符串"(3)"
。当然[2;3]
是一个整数列表,即int list
然后map1 nextasstr [2;3]
评估为[ "(3)"; "(4)" ]
,一个字符串列表,即string list
;你看到第二个参数的结果类型不同。 (这应该能够洞察'a list
与'b list
之间的区别以及输入
map1 : ('a -> 'b) -> 'a list -> 'b list
),第一个参数是任意类型的函数'a -> 'b
您应该看到Ocaml MOOC,按照Ocaml tutorial,阅读documentations。这可能需要数周的工作。