作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在思考如何最好地映射时,即traverse
, 一个 a -> Maybe a
-Kleisli 通过 unboxed vector ,我寻找了一个现有的实现。显然 U.Vector
不是 Traversable
, 但是 it does supply a mapM
,对于 Maybe
当然工作得很好。
但问题是:Monad
真的需要约束吗?好吧,事实证明,即使 boxed vectors cheat for the Traversable
instance :他们真的只是遍历一个列表,他们从/转换为:
instance Traversable.Traversable Vector where
{-# INLINE traverse #-}
traverse f xs = Data.Vector.fromList Applicative.<$> Traversable.traverse f (toList xs)
mono-traversable
does the same thing also for unboxed vectors ;在这里,这在性能方面似乎更加可怕。
vector
我不会感到惊讶实际上能够将许多这些被黑客入侵的遍历融合成一种更有效的形式,但是 - 似乎仍然存在一个基本问题,阻止我们立即在数组上实现遍历。这种无能有什么“深层原因”吗?
最佳答案
看完vector
的相关出处并试图制作 mapM
与 Applicative
合作我觉得原因Data.Vector.Unboxed.Vector
没有 traverse :: (Applicative f, Unbox a, Unbox b) -> (a -> f b) -> Vector a -> f (Vector b)
功能和Data.Vector.Vector
没有原生 traverse
是融合代码。违规者如下Stream
类型:
-- Data/Vector/Fusion/Stream/Monadic.hs Line: 137
-- | Result of taking a single step in a stream
data Step s a where
Yield :: a -> s -> Step s a
Skip :: s -> Step s a
Done :: Step s a
-- | Monadic streams
data Stream m a = forall s. Stream (s -> m (Step s a)) s
mapM
.
m
将与您第一次调用
Data.Vector.Unboxed.mapM
时相同.但是因为这条流的脊椎在
m
里面。仿函数,如果您只有
m
的应用程序,则无法使用它.
vector
上的此问题GitHub 仓库:
Weaken constraint on mapM .
vector
作品。
关于performance - 为什么不能应用遍历数组? (或者是吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41743198/
我是一名优秀的程序员,十分优秀!