作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
sequenceA
是一个众所周知的函数:
sequenceA :: (Traversable t, Applicative f) => t (f a) -> f (t a)
我想知道我们是否可以为 Arrows 写一些类似的东西。不幸的是,我没有设法实现以下内容:
sequenceArr :: (Traversable t, Arrow a) => t (a b c) -> a b (t c)
据我了解,
Applicative
概括
Arrow
,因此,我们应该能够把它写下来。我是为列表做的:
sequenceArrLst :: Arrow a => [a b c] -> a b [c]
sequenceArrLst t = let t' = (>>> arr (: [])) <$> t
in foldr1 (\f g -> f &&& g >>> arr (uncurry (++))) t'
然而,正如人们所注意到的,我们并没有摆脱
a b
层,但将结果包装到一个新列表中。那么,我们如何才能真正摆脱
a b
层?我应该注意到,在
this question 下的评论中,
duplode指出:
...between
(.)
,id
,arr
andfirst
, there isn't anything that allows collapsing twoa r
layers into one.
ArrowApply
为了这?老实说,我把这个写下来了,还是没能去掉里面的箭头
t
:
sequenceArrApp :: (Functor f, ArrowApply a) => f (a b c) -> a b (f (a () c))
sequenceArrApp t = arr $ \ b -> (\ f -> arr (\ () -> (f, b)) >>> app) <$> t
是否可以调整此代码段以缺少
a ()
层?
sequenceArr :: (Traversable t, Arrow a) => t (a b c) -> a b (t c)
- 我们可以写下来吗?如果是这样,如何? a b
层( Arrow a
)。如果是这样,为什么我们写 join
for Arrow
时它们不起作用?下来(如果他们实际上没有)? ArrowApply
为了这?如果是这样,如何?是否可以调整我的变体以获得此结果:sequenceArr :: (Traversable t, ArrowApply a) => t (a b c) -> a b (t c)
? 最佳答案
As far as I understand,
Applicative
generalizesArrow
, thus, we should be able to write this down.
Arrow
的输入类型参数,则生成的
* -> *
类型构造函数将是
Applicative
”,即
sequenceArr
您最初提出的金额为
sequenceA
专门用于可以以这种方式从箭头中挤出的应用程序。由于这些应用程序可以通过
the WrappedArrow
newtype 表示,一种可能的定义是:
sequenceArr :: (Traversable t, Arrow a) => t (a b c) -> a b (t c)
sequenceArr = unwrapArrow . sequenceA . fmap WrapArrow
怎么看
WrappedArrow
实例化
Applicative
...
instance Arrow a => Applicative (WrappedArrow a b) where
pure x = WrapArrow (arr (const x))
liftA2 f (WrapArrow u) (WrapArrow v) =
WrapArrow (u &&& v >>> arr (uncurry f))
... 应该确认此实现与您的写作尝试在精神上一致
sequenceArrLst
.
sequenceArr
确实与
traverse'
和
Data.Profunctors.Traversing
非常不同,后者是
discusses in the comments 。而不是
sequenceA
的特化,
traverse'
概括了 5 到其他 |7 到其他 |911尺寸。)
关于list - 如何为 Arrows 写下序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62762965/
我是一名优秀的程序员,十分优秀!