作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想概括一下双仿函数 lmap
一点点。lmap
通常接受一个函数并将其映射到双仿函数中的左仿函数。
首先,我概括一下 Functor
的想法。到 (->)
以外的类别(这将帮助我们消除对 Bifunctor
类的需求)。
class Category cat where
id :: cat a a
(.) :: cat b c -> cat a b -> cat a c
instance Category (->) where
id x = x
(f . g) a = f (g a)
class (Category s, Category t) => Functor s t f where
map :: s a b -> t (f a) (f b)
Flip
这样我就可以制作逆变仿函数和双仿函数。
newtype Flip p a b =
Flip
{ unflip :: p b a
}
lmap
通过解除常规
map
高达
Flip
:
lmap c = unflip . map c . Flip
Flip
和
unflip
有相当有限的类型。
Flip :: p b a -> Flip p a b
unflip :: Flip p a b -> p b a
lmap ::
( Functor s (->) (Flip p c)
)
=> s a b -> p a c -> p b c
(->)
在
Flip
和
unflip
强制我们的仿函数映射到
(->)
类别。
(->)
唯一的类别
Flip
可以看作是态射,例如,对于
Flip :: Flip (->) (p a b) (Flip p b a)
Flip :: Monad m => Kleisli m (p a b) (Flip p b a)
Flip :: Monad m => Flip (Kleisli m) (p a b) (Flip p b a)
Category
的每个实例我能想到
Flip
有一个明确的任何简单实例.但我显然无法构建
Flip
出
(.)
和
id
独自的。
lmap
至
lmap ::
( Functor s t (Flip p c)
)
=> s a b -> t (p a c) (p b c)
map
.
(->)
?
最佳答案
{-# LANGUAGE FlexibleInstances, FlexibleContexts
, MultiParamTypeClasses, UndecidableInstances #-}
import qualified Prelude
import Control.Category.Constrained.Prelude
import Control.Arrow.Constrained
import Data.Type.Coercion
newtype Flip p a b = Flip { unflip :: p b a }
lmap :: ( Functor (Flip p c) s t
, EnhancedCat s Coercion, EnhancedCat t Coercion
, Object s a, Object s b
, Object t (p a c), Object t (p c b), Object t (p b c)
, Object t (Flip p c b), Object t (Flip p c a) )
=> s a b -> t (p a c) (p b c)
lmap c = flout Flip . fmap c . follow Flip
instance Prelude.Functor (Flip (,) a) where
fmap f (Flip (x,y)) = Flip (f x,y)
instance Prelude.Monad m
=> Functor (Flip (,) a) (Kleisli m (->)) (Kleisli m (->)) where
fmap (Kleisli f) = Kleisli $ \(Flip (x,y)) -> do
x' <- f x
return $ Flip (x',y)
main :: IO ()
main = do
print $ lmap (+1) (0,0)
t' <- runKleisli (lmap $ Kleisli print) (10,20)
print t'
return ()
关于haskell - 是否可以概括这个 lmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61585621/
我想概括一下双仿函数 lmap一点点。 lmap通常接受一个函数并将其映射到双仿函数中的左仿函数。 首先,我概括一下 Functor 的想法。到 (->) 以外的类别(这将帮助我们消除对 Bifunc
假设我想从列表中获取所有 5 个字母的单词。 set words {apple banana grape pear peach} lmap word $words {if {[string lengt
假设我想从列表中获取所有 5 个字母的单词。 set words {apple banana grape pear peach} lmap word $words {if {[string lengt
我们有 Aerospike 服务器版本 3.8.3(支持 LDT) 我们遇到以下异常 - 2018-08-01 16:11:31,558 1320573 [task-scheduler-3] ERRO
我是一名优秀的程序员,十分优秀!