首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成的折叠类型、iter和map与ppx_deriving文档不一致

生成的折叠类型、iter和map与ppx_deriving文档不一致
EN

Stack Overflow用户
提问于 2020-04-08 12:29:42
回答 1查看 138关注 0票数 5

我正在努力正确地设置我的OCaml环境,以使用ppx派生程序映射、折叠和iter,如此处所述:https://github.com/ocaml-ppx/ppx_deriving#plugins-iter-map-and-fold

我的最小示例在这里(我使用的是Base,因为这是我在更广泛的项目中使用的一个库):

代码语言:javascript
复制
open Base;;

type data = Row of float array | Dim of data array
[@@deriving iter, map, fold, show];;

let t = Row [|2.;2.|];;
pp_data Caml.Format.std_formatter t;;
map_data (fun x -> x +. 1.) t;;
pp_data Caml.Format.std_formatter t;;

下面的代码是用ocamlfind ocamlc -package base -package ppx_deriving.iter -package ppx_deriving.map -package ppx_deriving.fold -package ppx_deriving.show -linkpkg -g test.ml && ./a.out编译的;我得到一个编译错误,说明map_datadata -> data类型。但是根据文档和我的一般知识,map得到了一个函数和一个可映射的结构,而这里的情况似乎并非如此。在utop中测试这一点会给我同样的错误。

我遗漏了什么吗?

(预先谢谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-08 13:13:17

这些派生器处理多态数据结构,并将用户函数应用于与该结构的类型变量相对应的所有值。由于您没有任何类型变量,所以生成的map_data函数有缺陷,但是非常自然,因为缺少类型变量意味着一个常量函数。

换句话说,对于一些带有map_x类型变量的多态type ('s1, ..., 'sN) xN函数的一般结构是

代码语言:javascript
复制
('s1 -> 't1) -> ... -> ('sN -> 'tN) -> ('s1,...,'sN) x -> ('t1,...,'tN) x

也就是说,对于每个类型变量,它期望一个函数将该类型的值映射到其他类型,这样在您的情况下,映射函数的参数数是N+1,因为您有零类型变量,所以没有映射函数,所以只有x -> x

如果要将您的类型重新定义为

代码语言:javascript
复制
type 'a data = Row of 'a array | Dim of 'a data array
[@@deriving iter, map, fold, show]

您将得到具有expect类型的map_data ('a -> 'b) -> 'a data -> 'b data。派生器甚至会理解数组是一种数据结构,并对其进行递归,例如,

代码语言:javascript
复制
let input = Dim [|Row [|1;2;3|]; Row [|3;4;5|]|]
map_data (fun x -> x + 1) input;;
- : int data = Dim [|Row [|2; 3; 4|]; Row [|4; 5; 6|]|]

当然,如果您不希望在接口中使用多态类型,则始终可以创建类型别名,例如,

代码语言:javascript
复制
type t = float data

并将map_data公开为

代码语言:javascript
复制
val map_data : (float -> float) -> t -> t
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61100710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档