Pure语言中如何定义地图融合?

How to define map fusion in the Pure language?

我正在试验基于术语重写的 Pure 语言。

我想用方程式定义 "map fusion",如下所示:

> map f (map g list) = map (f . succ . g) list;

succ 用于验证规则是否生效。)

不过好像不行:

> map id (map id [2,3,4]);
[2,3,4]

Pure manual 表示

expressions are evaluated using the “leftmost-innermost” reduction strategy

所以我想发生的事情是最里面的 map id [2,3,4] 表达式首先被减少,所以我的规则永远不会生效。

那么地图融合怎么实现呢?

这是一个相关的实验。第一条规则未生效:

> a (b x) = "foo";
> b x = "bar";
> a (b 5);
a "bar"

我应该更仔细地阅读 the manual。我需要做的是使用 def 关键字将模式转换为宏。这样就可以了:

> def map f (map g list) = map (f . succ . g) list;
> map id (map id [2,3,4]);
[3,4,5]