当前位置:  开发笔记 > 编程语言 > 正文

理解身份仿函数

如何解决《理解身份仿函数》经验,为你挑选了1个好方法。

我正在通过本教程.如教程中所述,我复制了一些代码,用于表示functor compositionidentity functor:

{-# LANGUAGE FlexibleContexts #-}
module Test where

newtype FComp f g a = C { unC :: f (g a) }

instance (Show (f (g a))) => Show (FComp f g a) where
  show (C x) = "FComp " ++ show x

instance (Functor f, Functor g) => Functor (FComp f g) where
  fmap h (C x) = C (fmap (fmap h) x)

newtype Id a = Identity { unId :: a } deriving Show

instance Functor Id where
    fmap f x = Identity (f (unId x))

现在,这是教程所述的内容identity functor:

Composition with the identity functor in the same category is as expected.
F?IdB = F  
IdA?F = F

我所坚持的是试图用FComp上面的代码所代表的仿函数组合来考虑它.以下示例:

$ let a = C (Identity (Just (5::Int)))
$ :t a
a :: FComp Id Maybe Int
$ let b = C (Just (Identity (5::Int)))
$ :t b
b :: FComp Maybe Id Int

我不能想办法断言类型的ab上述的例子中表示为是相同的.我将不胜感激怎么想的指针identity functor来讲functor composition.



1> leftaroundab..:

就像在Haskell,应用范畴论许多公式,˚F ∘标识 ≡标识一个˚F˚F应该真的只是被解读为等价.与类型检查器FComp Id Maybe Int非常不一样FComp Maybe Id Int; 但是你可以很容易地写

idFunctorIso :: Functor f => FComp f Id a -> f a
idFunctorIso (C fIdca) = fmap unId fIdca

idFunctorIso' :: Functor f => f a -> FComp f Id a
idFunctorIso' fa = C $ fmap Identity fIdc

这意味着两种类型都包含相同的信息1.这就是我们所说的他们是同构的意思.


1无信息丢失在任一方向,因为idFunctorIso' . idFunctorIso ≡ id(来自算符法如下fmap id ≡ id,与事实一起unCunId是NEWTYPE构造的简单倒数).


@Rhymoid:对.你为什么不自己写这个?你不需要删除你的答案,即使它与我的重叠很多......额外的阐述和不止一个观点永远不会伤害你.
推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有