代码之家  ›  专栏  ›  技术社区  ›  srghma

哈斯克尔函数的双解算符在哪里?

  •  7
  • srghma  · 技术社区  · 8 年前

    我找不到与fmap类似的bifunctor。

    说明:

    对象的函数-数据类型构造函数。类型- a -> f a

    函数的函数- fmap . 类型- (a -> b) -> (fa -> fb)

    对象的双分叉-结果 bimap f g ,在哪里 f :: (a -> a') , g :: (b -> b') . 类型- p a b -> p a' b'

    函数双解符-?.类型- p (a -> b) (c -> d) -> p (a' -> b') (c' -> d')

    这就是为什么我认为Bifunctor有这样的类型(我是对的吗?)举个例子

    enter image description here


    更新

    enter image description here


    更新2

    P(A->B)(C->D)->P(A'->B')(C'->D') 在上面的图像中,是从一个分支到另一个分支的变形,也是一个分支(因为所有的函数都是分支)

    总结:

    我想 P(A->B)(C->D)->P(A'->B')(C'->D') 是函数的双解符,但不是。变形的双算符是 bimap. Type: (a -> b) -> (α -> β) -> p a α -> p b β.

    我想 P(A->B)(C->D)->P(A'->B')(C'->D') 是不寻常的,但不是,只是功能

    2 回复  |  直到 8 年前
        1
  •  11
  •   leftaroundabout    8 年前

    对象的函数-数据类型构造函数。类型- a -> f a

    函数的函数- fmap . 类型- (a -> b) -> (fa -> fb)

    尽管这大体上是有意义的,但重要的是要认识到上面的箭头有三种不同的含义。

    对象的函数-数据类型构造函数。类型- a ⟼ f a

    函数的函数- FMAP . 类型- (a ⟿ b) ⟶ (f a ⟿ f b)

    哪里

    • ⟼ 是类型级别映射到与类型关联的符号 a 有一个类型 f a . 是的。 不 与域为 一 和密码瘤 甲A . (这些在应用程序/单子中找到,但情况不同。)
    • ⟿ 是某种形式的类型构造函数。在 哈斯克 类,这些变形恰好是haskell函数,但这只是一个特例。
    • ⟶ 是实际的函数类型构造函数。

    你现在可以忘记后两者的区别,但是 阿维 和 阿维 在概念上是完全不同的 阿西 . 基本上, 阿维 就像你写的箭头 兰姆达

    Maybe :: Type -> Type
    Maybe = \a ⟼ Maybe a
    

    鉴于 阿维 只是一种表达你抽象于功能性事物的方式。

    另一个可能不清楚的相关问题是 物体 你说的是 haskell类型 . 不是值(就像OO对象一样)。

    所以,我会用这样的话来表达你上面给出的清单:

    • 函数

      • 对于对象:数据类型构造函数。种类 Type -> Type ,映射关联 A_¼F A .
      • 对于变形: FMAP . Type: (a -> b) -> (f a -> f b) .
    • 双离合器

      • 对于对象:数据类型构造函数。种类 Type×Type -> Type 或咖喱 Type -> Type -> Type ,映射关联 a ⟼ b ⟼ p a b .
      • 对于变形: bimap . Type: (a -> b) -> (α -> β) -> p a α -> p b β .

    阿西 实际上,哈斯克尔没有 阿维 或者你写的东西 A->F甲 . 这将是一个类型级lambda,但类型级函数实际上只能表示为 类型族 也就是说,你能表达的最接近 甲A 是 type instance Functored a = f a .

        2
  •  1
  •   chepner    8 年前

    你不需要 Bifunctor 的实例 (->) ,只是 (,) :

    b1 :: a -> Id a
    b2 :: a -> Id2 a
    
    -- instance Bifunctor (,) where
    --   bimap f g (x, y) = (f x, g y)
    
    f :: (Int, Float) -> (Id Int, Id2 Float)
    f = bimap b1 b2
    
    推荐文章