Haskell 数据的一元concatMap。向量?
我正在从Data.Vector包中寻找一些东西,它的工作原理类似于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
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)=做
r1Monad 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)。