【发布时间】:2011-06-02 18:30:43
【问题描述】:
我仍然在掌握如何在 Haskell 中定义和使用箭头。在定义新箭头时,我更容易考虑 *** 或 &&& 而不是第一个和第二个,因为大多数时候我希望对两个箭头组合时进行特殊处理。
但是,Arrow 类不允许根据 arr 和 *** 或 &&& 定义箭头,并且需要包含 first 的定义。这意味着我不得不编写如下代码 -
instance Arrow X where
arr f = ...
f (***) g = ...
first f = f *** arr id
在我看来,在 Control.Arrow 模块中包含“first”的默认定义并没有什么坏处。这将允许我们在定义 first 或 *** 之间进行选择。
第一个默认定义没有包含在 Arrow 类中是否有充分的理由?我能想到的唯一原因是用户可能会忽略 first 和 *** 的定义,然后你会有循环定义,但这是唯一的原因吗?
【问题讨论】:
-
我怀疑循环定义的可能性是原因,因为这种情况存在于其他类型类中;例如,
(==)和(/=)在Eq。