gpt4 book ai didi

haskell - (\f -> fmap f id) 是否总是等价于 arr?

转载 作者:行者123 更新时间:2023-12-04 03:57:30 25 4
gpt4 key购买 nike

Category 的一些实例也是 Functor 的实例.例如:

{-# LANGUAGE ExistentialQuantification, TupleSections #-}

import Prelude hiding (id, (.))
import Control.Category
import Control.Arrow

data State a b = forall s. State (s -> a -> (s, b)) s

apply :: State a b -> a -> b
apply (State f s) = snd . f s

assoc :: (a, (b, c)) -> ((a, b), c)
assoc (a, (b, c)) = ((a, b), c)

instance Category State where
id = State (,) ()
State g t . State f s = State (\(s, t) -> assoc . fmap (g t) . f s) (s, t)

(.:) :: (Functor f, Functor g) => (a -> b) -> f (g a) -> f (g b)
(.:) = fmap . fmap

instance Functor (State a) where
fmap g (State f s) = State (fmap g .: f) s

instance Arrow State where
arr f = fmap f id
first (State f s) = State (\s (x, y) -> fmap (,y) (f s x)) s

这里 arr f = fmap f id对于 instance Arrow State . Category 的所有实例都是如此吗?这也是 Functor 的实例?类型签名是:
arr               ::                 Arrow    a  => (b -> c) -> a b c
(\f -> fmap f id) :: (Functor (a t), Category a) => (b -> c) -> a b c

在我看来,它们应该是等价的。

最佳答案

首先让我们明确一下 Arrow C方法。嗯,这是两个完全不同的东西结合在一起——在我的书中,

  • well-pointed monoidal categories的类(class).
  • categories which generalise Hask的类(class).
  • arr来自后者。 “概括” 哈斯克 ?这意味着只是从类别 中进行映射。哈斯克C . – 在数学上,从一个类别映射到另一个类别正是 functor做! (标准的 Functor 类实际上只涵盖了一种非常特殊的仿函数,即 Hask 上的内仿函数。) arr是非内仿函数的态射方面,即“规范嵌入仿函数” 哈斯克C .

    从这个角度来看,前两个箭头定律
    arr id = id
    arr (f >>> g) = arr f >>> arr g

    只是仿函数定律。

    现在,如果您正在实现 Functor,这意味着什么?一个类别的实例?为什么,我敢说这只是意味着您正在表达相同的规范嵌入仿函数,但是通过 C 的必要表示回到 哈斯克 (这使它成为一个整体的内仿函数)。因此,我认为是的, \f -> fmap f id应该等价于 arr ,因为基本上它们是表达同一事物的两种方式。

    关于haskell - (\f -> fmap f id) 是否总是等价于 arr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31618370/

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