我很好奇Kiselyov 和 Shan 在Function Pearl: Implicit Configurations文章 中讨论的对隐式参数的反对意见。
在存在隐式参数的情况下内联代码(β-reduce)是不合理的。
真的吗?我希望 GHC 应该内联到与传递的隐式参数相同的范围,不是吗?
我相信我理解他们的反对意见:
如果添加、删除或更改术语的签名,则术语的行为可能会发生变化。
GHC 的用户文档解释说,程序员必须注意多态递归和单态限制。这是否是他们所说的内联问题的意思?
我认为这个多态递归示例也涵盖了“对隐式参数进行泛化”的含义?还要别的吗?
Data.Reflection中的ReifiesStorable
类型类真的是解决这些困难的明智之选吗?它似乎在每次访问时都会反序列化整个隐式数据结构,这听起来对性能来说是灾难性的。例如,我们可能希望我们的隐含信息是 Cayley 表或字符表,它们占据了 ram,并且必须在数百万次代数运算期间访问。
是否有一些更好的解决方案使用隐式参数,或者编译器可以在幕后轻松优化的另一种技术,同时仍然通过使用状态线程或其他方式的类型系统保证更多?