【发布时间】:2017-02-18 08:17:30
【问题描述】:
下面是一个可能很愚蠢的例子,但我认为解决这个问题将解决我遇到的另一个问题,详细 in this question。
我想用这个签名写一个函数:
myread :: (Read a) => String -> a
这样,myread = read,除非a ~ Int,在这种情况下myread _ = 0。
显然这个函数本身很傻,但重点是我想根据返回类型进行优化。
重写规则,或者这里什么都可以。对于我的实际问题,如果解决方案是重写规则,那么是否存在不触发的情况并不重要,但我希望答案至少给出一个示例。
【问题讨论】:
-
您似乎已经有了正确的工具——
a上的类约束。当然,您无法控制Read Int实例,但在您的实际用例中,您似乎确实控制了类的定义和实例。或者我误解了你所说的“优化”是什么意思? (旁白:我认为另一个答案中的解决方案不起作用,因为x :: H a => T a不是指“上下文H a 中类型为T a 的x”而是“类型为'H a => T a 的x”,即该规则将应用于(Read a => F a) -> X而不是Read a => F a -> X) -
我无法控制
Read类,并且当Int已经存在时,我无法为Int创建自己的Read实例。可能我误会你了。
标签: haskell optimization ghc