功能在OCaml中的功能混淆书籍的例子(初学者)

时间:2016-01-03 19:11:13

标签: function ocaml

# 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的新手,我有两个问题:

  1. 在第三行中,为什么在h :: map1 f t之前有一个f? f应该是map1函数中的参数。为什么这本书的例子单独写出来?
  2. 在第一个例子中('a -> 'b) -> 'a list -> 'b list = <fun>为什么有一个b列表? 该书解释说,b列表是函数f的结果,列表是函数f的参数。但是,为什么以下示例中没有ab列表?它还有一个函数f,它还将f分别放在第三行。
  3. # 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>

1 个答案:

答案 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。这可能需要数周的工作。