gpt4 book ai didi

haskell - 执行函数组合时 '.'和 '<<<'有什么区别?

转载 作者:行者123 更新时间:2023-12-01 22:24:58 25 4
gpt4 key购买 nike

我正在尝试在 Haskell 中执行函数组合,但我不确定哪个运算符是正确的。

文档包含这两种类型签名:

(.) :: (b -> c) -> (a -> b) -> a -> c 
(<<<) :: Category cat => cat b c -> cat a b -> cat a c

显然,这两个选项之间的区别在于存在/不存在Category cat,但是这个注释意味着什么,以及我应该如何使用这些信息来选择一个运算符而不是另一个?

在比较其他两个运算符时,我还注意到上述两个签名的第三个变体:

(>>) :: forall a b. m a -> m b -> m b 
(>>>) :: Category cat => cat a b -> cat b c -> cat a c

forall 注释是什么意思——>> 用于第三种场景?

最佳答案

首先,您应该认识到 (.)在 Prelude 中以特定于函数的形式定义

(.) :: (b -> c) -> (a -> b) -> a -> c 

以及 Category 提供的更通用的功能类:

class Category cat where
-- | the identity morphism
id :: cat a a

-- | morphism composition
(.) :: cat b c -> cat a b -> cat a c

(->) Category 的实例清楚表明两者的功能相同:

instance Category (->) where
id = GHC.Base.id
(.) = (GHC.Base..)

(<<<)的定义明确表明它只是 (.) 的同义词

-- | Right-to-left composition
(<<<) :: Category cat => cat b c -> cat a b -> cat a c
(<<<) = (.)

旨在与 (>>>) 对称运算符(operator)。您可以写 f >>> gg <<< f ,以对您的特定用途更有意义的为准。

<小时/>

(>>)是一个完全不同的运算符(至少,只要您没有深入研究单子(monad)理论)。 (>>)(>>=) 的一个版本忽略第一个操作数的结果,仅将其用于其效果。

x >> y == x >>= (\_ -> y)

关于haskell - 执行函数组合时 '.'和 '<<<'有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52047835/

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