2015-04-28 42 views
1

我正在嘗試基於術語重寫的Pure語言。如何在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

表達式是使用了「最左邊最裏面」削減戰略

評價,所以我想這是怎麼回事是最裏面的map id [2,3,4]表達首先降低了,所以我的規則永遠不會踢英寸

如何使地圖融合工作,然後呢?

這是一個相關的實驗。第一條規則並未引發:

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

回答

1

我應該更仔細地閱讀the manual。我需要做的是使用關鍵字def將模式變成宏。這樣它的工作原理:

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