gpt4 book ai didi

haskell - 为什么我不能用 arr 和 ***/&&& 定义 Haskell Arrow 实例

转载 作者:行者123 更新时间:2023-12-04 01:06:28 28 4
gpt4 key购买 nike

我仍然在掌握在 Haskell 中定义和使用箭头。在定义新箭头时,我更容易考虑 *** 或 &&& 而不是第一个和第二个,因为大多数时候我希望对两个箭头组合时进行特殊处理。

然而,Arrow 类不允许根据 arr 和 *** 或 &&& 定义箭头,并且需要包含 first 的定义。这意味着我被迫编写如下代码 -

instance Arrow X where
arr f = ...
f (***) g = ...
first f = f *** arr id

在我看来,在 Control.Arrow 模块中包含“first”的默认定义并没有什么害处。这将允许我们在定义 first 或 *** 之间进行选择。

第一个默认定义没有包含在 Arrow 类中是否有充分的理由?我能想到的唯一原因是用户可能会忽略 first 和 *** 的定义,然后你会有循环定义,但这是唯一的原因吗?

最佳答案

Data.Monoid 有一个类似的缺失替代最小完整定义:mconcat。与 Arrow 一样,出于性能原因,它缺少这种替代方案。 mappend a b = mconcat[a,b]由于 mconcat 中的模式匹配,效率低下。

使用 Arrows,效率不那么明显,但更残酷:想想无法优化 arr id离开:

使用 CleisliArrow 作为示例箭头,它是这样的:

first f (x,y) = do
x' <- f x
return (x',y)

它会是:
first f (x,y) = do
x' <- f x
y' <- arr id y
return (x',y')

arr 函数无法与 id 函数进行模式匹配,因此必须引入额外的开销来包装该函数。

关于haskell - 为什么我不能用 arr 和 ***/&&& 定义 Haskell Arrow 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6218738/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com