我可以在Haskell中编写自己的受流融合影响的map函数吗?
为什么列表上的递归迭代不受融合的影响?这完全扼杀了Haskell模式匹配的出色表现力:foo (x:xx) ...!
是否融合了前置循环函数?
发布于 2016-08-06 18:57:05
Haskell中的流融合是使用重写规则(see the ghc documentation for more info)完成的。您可以使用RULES杂注在代码中指定这些规则。
重写规则的基本思想是,您指定了一组可以在编译时重写代码的方法。例如,如果您将自己的map版本定义为map',则可以执行以下操作
{-# RULES
"map'/map'" forall f g xs. map' f (map' g xs) = map' (f . g) xs
#-}这引入了一个名为map'/map'的重写规则。该规则所做的是,它将重写列表上函数f的每个映射,该列表依次将某个xs上的g映射为这些X上的(f . g)的一个映射。
使用重写规则还有许多其他的子项。例如,您可以指定在编译器的哪个阶段应用规则,而编译器无法检查这些规则是否正确。
重写结果仍然是类型检查的,但如果你在重写规则中做了一些语义上不正确的事情,那完全是你的错。
https://stackoverflow.com/questions/38788221
复制相似问题