Ocaml 逆向和映射

Ocaml reverse and map

我有一个任务要创建 map_reverse 函数。

let rec map_rev func = function
        [] -> [] 
    |   h::t -> map_rev func t @ func h;;

let f x = x * 7;;

open Printf
let a = map_rev f [1;2;10;20;400]
let () = List.iter (printf "%d ") a

现在,编译器将不允许这一行:

let a = map_rev f [1;2;10;20;400]

因为:

'This expression has type 'a * 'b but an expression was expected of type 'c -> 'd list'.

谁能指出我的错误?为什么它期望 'c -> 'd 列表?

地图反转函数的类型应该是('a -> 'b) -> 'a list -> 'b list。您的 map_rev 函数的类型为 ('a -> 'b list) -> 'a list -> 'b list。所以关键是弄清楚为什么编译器认为 func returns a list.

let rec map_rev func = function
        [] -> []
    |   h::t -> map_rev func t @ [func h ];;