作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
This article by Chris Penner谈论“枯萎的光学”;可用于从结构中过滤项目的光学元件。
本文对这些光学器件使用以下“Van Laarhoven”表示:
type Wither s t a b = forall f. Alternative f => (a -> f b) -> s -> f t
大多数(如果不是全部)Van Laarhoven 光学具有等效的 profunctor 表示。例如镜头:
type Lens s t a b = forall f. Functor f => (a -> f b) -> s -> f t
相当于:
type Lens s t a b = forall p. Strong p => p a b -> p s t
是否
Wither
也有Profuctor代表?如果是这样,那是什么?
最佳答案
克里斯在这里;这是我在 profunctor 光学表示中的摇摆:
Here's the profunctor class :
import Data.Profunctor
import Data.Profunctor.Traversing
import Control.Applicative
class (Traversing p) => Withering p where
cull :: (forall f. Alternative f => (a -> f b) -> (s -> f t)) -> p a b -> p s t
instance Alternative f => Withering (Star f) where
cull f (Star amb) = Star (f amb)
instance Monoid m => Withering (Forget m) where
cull f (Forget h) = Forget (getAnnihilation . f (AltConst . Just . h))
where
getAnnihilation (AltConst Nothing) = mempty
getAnnihilation (AltConst (Just m)) = m
newtype AltConst a b = AltConst (Maybe a)
deriving stock (Eq, Ord, Show, Functor)
instance Monoid a => Applicative (AltConst a) where
pure _ = (AltConst (Just mempty))
(AltConst Nothing) <*> _ = (AltConst Nothing)
_ <*> (AltConst Nothing) = (AltConst Nothing)
(AltConst (Just a)) <*> (AltConst (Just b)) = AltConst (Just (a <> b))
instance (Semigroup a) => Semigroup (AltConst a x) where
(AltConst Nothing) <> _ = (AltConst Nothing)
_ <> (AltConst Nothing) = (AltConst Nothing)
(AltConst (Just a)) <> (AltConst (Just b)) = AltConst (Just (a <> b))
instance (Monoid a) => Monoid (AltConst a x) where
mempty = (AltConst (Just mempty))
instance Monoid m => Alternative (AltConst m) where
empty = (AltConst Nothing)
(AltConst Nothing) <|> a = a
a <|> (AltConst Nothing) = a
(AltConst (Just a)) <|> (AltConst (Just b)) = (AltConst (Just (a <> b)))
如果你对一些出现的光学感兴趣,我已经实现了其中的一些
here :
关于haskell - "Wither"的 Profunctor 表示是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64634005/
我正在检查以下代码示例,发现一旦实现“first”并成为Cartisian的成员,就很难弄清楚如何使用(->)和(Star f)。 有人可以为他们提供一些易于理解的示例吗?谢谢。 -- Intuiti
我们可以定义data Free f a = Pure a | Free (f (Free f a))还有Functor f => Monad (Free f) . 如果我们定义data T f a b
This article by Chris Penner谈论“枯萎的光学”;可用于从结构中过滤项目的光学元件。 本文对这些光学器件使用以下“Van Laarhoven”表示: type Wither
我是一名优秀的程序员,十分优秀!