gpt4 book ai didi

haskell - Control.Arrow 与 Data.Tuple.Extra

转载 作者:行者123 更新时间:2023-12-02 12:44:39 24 4
gpt4 key购买 nike

我经常使用Data.Tuple.Extra库的以下函数:firstsecond***&&&两者

Control.Arrow 中有等效的 (?) 函数。事实上,我更喜欢 Data.Tuple.Extra,因为我完全迷失了 Control.Arrow 的文档。

使用 Control.Arrow 有什么优势(例如从性能角度来看)?

最佳答案

我不熟悉Data.Tuple.Extra,但从文档来看,它似乎提供了与Control.Arrow基本相同的功能。它的文档甚至指出:

Some of these functions are available in the Control.Arrow module

您可以使用 Control.Arrow 轻松实现 dupeboth 函数:

dupe = id &&& id
both f = first f >>> second f

示例:

Prelude Control.Arrow> dupe 42
(42,42)
Prelude Control.Arrow> both (+1) (41, 1336)
(42,1337)

使用Control.Arrow有什么优势吗?它更通用,因为它基于 Arrow 类型类,该类又源于范畴论...此外,该模块包含在 base 包中,因此它始终可用。

更一般地说,这里定义的 both 类型是 Arrow a => a d c -> a (d, d) (c, c),这意味着您可以将它与任何 Arrow 一起使用,而不仅仅是“基本”功能。例如,考虑一个 Kleisli 箭头。

Prelude 中的 print 函数的类型为 Show a => a -> IO (),并且由于 IO 是一个 Monad,您可以将其设为 Kleisli 实例,应用 both,并在一对上运行它:

Prelude Control.Arrow> runKleisli (both $ Kleisli print) (42, 1337)
42
1337
((),())

我不知道这个特定的示例在现实生活中是否有用,但它表明 both 的这种实现更加通用。

<小时/>

顺便说一句,对也是 Bifunctor 实例,因此您还可以使用 Data.Bifunctor 中的 firstsecond >。您可以用 Bifunctor 来定义 both:

Prelude Data.Bifunctor> both f = bimap f f
Prelude Data.Bifunctor> :t both
both :: Bifunctor p => (a -> d) -> p a a -> p d d
Prelude Data.Bifunctor> both (+2) (40, 1335)
(42,1337)
Prelude Data.Bifunctor> both (*2) $ Right 21
Right 42
Prelude Data.Bifunctor> both (*2) $ Left 8
Left 16

请注意,由于这适用于任何 Bifunctor,因此除了一对之外,它还适用于 Either

但是,您不会从 Data.Bifunctor 获得 ***&&&...

关于haskell - Control.Arrow 与 Data.Tuple.Extra,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49230839/

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