如何解决什么语言有等式重写?
函数式程序效率低下的典型例子是从规范中编写的 reverse
函数
import Prelude()
[] ++ ys = ys
(x:xs) ++ ys = x:(xs ++ ys)
reverse [] = []
reverse (x:xs) = (reverse xs) ++ [x]
使用结合性,可以推导出有效的反向
-------- REWRITE ------
-- RULE : ++ relation (deduced)
-- reverse xs = reverse xs ++ []
-- RULE : [] relation -- case split
-- reverse [] = reverse [] ++ []
-- reverse (x::xs) = reverse (x::xs) ++ []
-- RULE : reverse relation
-- reverse [] = []
-- reverse (x::xs) = (reverse xs ++ [x]) ++ []
-- RULE : ++ relation (deduced)
-- reverse [] = []
-- reverse (x::xs) = reverse xs ++ ([x] ++ [])
-- RULE : ++ relation
-- reverse [] = []
-- reverse (x::xs) = reverse xs ++ (x::[])
-- RULE : (language)
-- reverse' [] _ = []
-- reverse' (x::xs) acc = reverse xs ++ acc
-- reverse xs = reverse' xs []
reverse_eff xs = reverse' xs []
where
reverse' [] ys = ys
reverse' (x:xs) ys = reverse' xs (x:ys)
然而,问题首先来自哪里?
- 我们指示
++
的特定订单 - 我们的语言定义的组合定义了我们的
++
的组合顺序 - 我们的语言不了解源自代码本身的法律,也不了解效率的概念。
我们真正想做的是:
- 指定一个(函数)关系
++
,由其所有定律适当地商数 - 为它使用关系组合,隐藏将使用哪个特定的括号
- 在使用站点,选择一个最适合我们的访问模式和目标的括号(在
reverse
的情况下,这意味着移动所有括号以匹配结果列表的构造方式)
是否有任何语言可以生成某些规律,并根据某些指标搜索最佳重写?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。