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]
我正在试验基于术语重写的 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]