Haskell 数据的一元concatMap。向量?

Haskell 数据的一元concatMap。向量?,haskell,vector,monads,Haskell,Vector,Monads,我正在从Data.Vector包中寻找一些东西,它的工作原理类似于concatMap,但与monad一起工作concatMap具有类型 (a -> Vector b) -> Vector a -> Vector b 但我在找一种有 (Monad m) => (a -> m (Vector b)) -> Vector a -> m (Vector b) 。。。或者,特别是以下任一情况: (MonadRandom m) => ((Int, Int

我正在从Data.Vector包中寻找一些东西,它的工作原理类似于
concatMap
,但与monad一起工作<代码>concatMap具有类型

(a -> Vector b) -> Vector a -> Vector b 
但我在找一种有

(Monad m) => (a -> m (Vector b)) -> Vector a -> m (Vector b)
。。。或者,特别是以下任一情况:

(MonadRandom m) => ((Int, Int) -> m (Vector Int)) 
                -> Vector (Int, Int) -> m (Vector Int)

(MonadRandom m) => (Int -> Int -> m (Vector Int))
                -> Vector (Int, Int) -> m (Vector Int)
下面的代码应该给出我试图做什么但产生错误的想法

无法将类型
VU.Vector Int
Int
匹配
预期类型:
m(VU.Vector Int)

实际类型:
m(VU.Vector(VU.Vector Int))

在表达式中:
return$VU.concatMap mate mates

import-Control.Monad
进口控制单随机
导入符合条件的Data.Vector.unbox为VU
testReprod::IO()
testReprod=do
让父母=VU.fromList[1::Int,2,3,4,5,6,7,8,9,10]
儿童(VU.Vector Int)->m(VU.Vector Int)
复制父母=返回$VU.concatMap mate mates
哪里
一半=VU.length双亲'div`2
配偶=VU.zip(VU.take-half-parents)(VU.drop-half-parents)
配偶::(蒙纳德兰多姆)=>(整数,整数)->m(矢量整数)
配偶(a,b)=做
r1
Monad m=>(a->m(向量b))->向量a->m(向量b)
不是太难-我们可以依赖
函子
Monad
,和
可遍历的
向量
实例。最大的警告是,您需要使用一个常规的(不是未装箱的)
向量

import Data.Vector (Vector)
import Control.Monad (join)

concatMapM :: Monad m => (a -> m (Vector b)) -> Vector a -> m (Vector b)
concatMapM f v = join <$> sequence (fmap f v)
import Data.Vector(向量)
导入控制.Monad(join)
concatMapM::Monad m=>(a->m(向量b))->向量a->m(向量b)
concatMapM f v=连接序列(fmap f v)
对未绑定向量执行此操作的问题是,在中间
fmap f v
步骤中,我有一个
向量(m(向量b))
,并且没有合理的
数据实例(也没有所需的相应
Monad m=>向量(m(向量b))
类实例)(Vector b))->Vector a->m(Vector b)
不是很难-我们可以依赖
函子
单子
、和
可遍历的
Vector
实例。最大的警告是,您需要使用常规的(而不是未绑定的)
Vector

import Data.Vector (Vector)
import Control.Monad (join)

concatMapM :: Monad m => (a -> m (Vector b)) -> Vector a -> m (Vector b)
concatMapM f v = join <$> sequence (fmap f v)
import Data.Vector(向量)
导入控制.Monad(join)
concatMapM::Monad m=>(a->m(向量b))->向量a->m(向量b)
concatMapM f v=连接序列(fmap f v)

对非固定向量执行此操作的问题是,在中间
fmap f v
步骤中,我有一个
向量(m(向量b))
,并且没有合理的
数据实例(也没有所需的相应
单子m=>向量(m(向量b))
类实例).

我不确定我是否理解您在寻找什么(或者我应该在您的代码示例中寻找什么)。能否添加一些类型签名(可能是暂定的)您要查找的内容有多少?您应该能够首先转换为装箱向量来完成此操作。如果您需要永不离开未装箱区域的原始性能,您可能需要自己修补库。@Alec添加了我要查找的函数的类型签名for@DanielWagner在com中如何使用装箱向量要取消装箱的型坯?我不确定我是否理解您在寻找什么(或者我应该在您的代码示例中寻找什么)。您可以添加一些类型签名(可能是暂定的)吗您要查找的内容有多少?您应该能够首先转换为装箱向量来完成此操作。如果您需要永不离开未装箱区域的原始性能,您可能需要自己修补库。@Alec添加了我要查找的函数的类型签名for@DanielWagner在com中如何使用装箱向量要取消装箱的型坯?暂时假设
mate
函数不是一元函数,例如,它的类型为sig
(Int,Int)->m(VU.Vector Int)
,因此可以使用
concatMap
。假设两种情况下都是装箱向量,那么big-o运行时会与您的情况不同吗?@tsorn您的意思是
(Int,Int)->(VU.Vector Int)
?不是
(Int,Int)->m(VU.Vector Int)
它当前的类型?是的,对不起,我就是这么想的meant@tsorn如果没有优化,渐进复杂性将是相同的。也就是说,
vector
包以积极使用重写规则而闻名,而非一元版本更容易受此影响,因此它可能最终融合为更快。@t我认为对于某些固定的
f
,它确实是O(n+m)。暂时假设
mate
函数不是一元函数,例如,它的类型是sig
(Int,Int)->m(VU.Vector Int)
这样就可以使用
concatMap
了。假设两种情况下都使用了装箱向量,那么big-o运行时会与您的情况不同吗?@tsorn您的意思是
(Int,Int)->(VU.Vector Int)
?不是
(Int,Int)->m(VU.Vector Int)
它当前的类型?是的,对不起,我就是这么想的meant@tsorn如果没有优化,渐进复杂性将是相同的。也就是说,
vector
包以积极使用重写规则而闻名,而非一元版本更容易受此影响,因此它可能最终融合为速度快得多。@t我认为对于某些固定的
f
,它确实是O(n+m)。