gpt4 book ai didi

haskell - (<*>) 中的 * 有特殊含义吗?

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

试图扩大我对 Haskell 中符号的理解:

  • ($) : 函数应用运算符(允许您在函数上应用参数)
  • (&) : Function Application Operator 的翻转版? (&) = flip ($)
  • (<>) : 关联运算符(您会在半群和 Monoids 中找到它)
  • (<$>) : 功能申请($)提升到 Functor 结构
  • (<&>) : 翻转仿函数图

  • 我们可以在 (*) 之间建立链接吗?和 (<*>) ?

    我不明白 * 的意思实际上...

    最佳答案

    这是故意的。 <*>具有 tensor product 的特征.这在 list monad 中最为明显:

    Prelude> (,) <$> ['a'..'e'] <*> [0..4]
    [('a',0),('a',1),('a',2),('a',3),('a',4)
    ,('b',0),('b',1),('b',2),('b',3),('b',4)
    ,('c',0),('c',1),('c',2),('c',3),('c',4)
    ,('d',0),('d',1),('d',2),('d',3),('d',4)
    ,('e',0),('e',1),('e',2),('e',3),('e',4)]

    更一般地说,应用仿函数(又名 monoidal functors)从仿函数后面的两个对象的乘积(即产品类型,也就是元组或通过柯里化(Currying)两个函数参数)映射到仿函数之前的乘积的仿函数结果。所以这确实是一个非常好的产品操作。

    φA,B: F A ∙ F B → F(A⊗B)

    ...在 haskell ,
    φ :: (f a, f b) -> f (a,b)
    φ = uncurry (liftA2 (,))
    -- recall `liftA2 f x y = f <$> x <*> y`

    甚至
    {-# LANGUAGE TypeOperators #-}
    type x ⊗ y = (x,y)

    φ :: f a ⊗ f b -> f (a⊗b)

    要查看历史方面,请查看 McBride and Paterson 2008 (doi: 10.1017/S0956796807006326 ),首先介绍 Applicative 的论文类型类。他们注意到

    The Applicative class features the asymmetrical operation , but there is an equivalent symmetrical definition.

    class Functor f -> Monoidal f where
    unit :: f ()
    (★) :: f a -> f b -> f (a,b)

    These operations are clearly definable for any Applicative functor...



    所以, <*>是 McBride 和 Paterson 的 的 ASCII 版本。运算符,它又是 的“应用”形式范畴论者以非柯里化(Currying)的形式称其为 φ。

    关于haskell - (<*>) 中的 * 有特殊含义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55513329/

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