gpt4 book ai didi

recursion - OCaml 显式多态类型注释

转载 作者:行者123 更新时间:2023-12-02 22:57:04 26 4
gpt4 key购买 nike

我很高兴收到一些关于以下示例的有用评论:
http://caml.inria.fr/pub/docs/manual-ocaml-400/manual021.html#toc79

7.12 Explicit polymorphic type annotations

type 'a t = Leaf of 'a | Node of ('a * 'a) t

let rec depth : 'a. 'a t -> 'b = function
|Leaf _ -> 1
| Node x -> 1 + depth x

我理解这个示例函数,但是当我尝试定义类型的“类似 map ”函数时

'a. 'a t -> ('a -> 'b) -> 'b t

例如:

let rec tmap: 'a. 'a t ->(f:'a->'b) -> 'b t = function
|Leaf x -> Leaf( f x)
|Node x -> let res = tmap x in Node(res);;

我收到以下错误:

Characters 67-77:
|Leaf x -> Leaf( f x)
^^^^^^^^^^

Error: This expression has type 'c t but an expression was expected of type
(f:'a -> 'b) -> 'b t

我不完全明白。如果有任何有用的评论,我将不胜感激。

最佳答案

您忘记获取第二个参数。

let rec tmap:
'a. 'a t ->(f:'a->'b) -> 'b t = (* asking for two arguments *)
function (* takes only the first argument *)
|Leaf x -> Leaf( f x)
|Node x -> let res = tmap x in Node(res);;

此外,'b 也必须是多态的,因为只要沿着树下降,您就希望生成嵌套元组。

这应该是,感谢 ivg:

let rec tmap : 'a 'b. 'a t -> f:('a->'b) -> 'b t =  fun t ~f ->
match t with
|Leaf x -> Leaf( f x)
|Node x -> let f (a,b) = (f a, f b) in Node ( tmap x ~f ) ;;

关于recursion - OCaml 显式多态类型注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28572596/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com