tso*_*orn 1 monads haskell vector
我正在寻找一些来自Data.Vector包的东西,它的工作concatMap原理与monad一起工作.concatMap有类型...
(a -> Vector b) -> Vector a -> Vector b
Run Code Online (Sandbox Code Playgroud)
但我正在寻找类型的东西......
(Monad m) => (a -> m (Vector b)) -> Vector a -> m (Vector b)
Run Code Online (Sandbox Code Playgroud)
...或者,特别是以下任何一个:
(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)
Run Code Online (Sandbox Code Playgroud)
下面的代码应该让我知道我正在尝试做什么,但会产生错误
无法将类型
VU.Vector Int与Int
预期类型匹配:m (VU.Vector Int)
实际类型:m (VU.Vector (VU.Vector Int))
在表达式中:return $ VU.concatMap mate mates
import Control.Monad
import Control.Monad.Random
import qualified Data.Vector.Unboxed as VU
testReprod :: IO()
testReprod = do
let parents = VU.fromList [1::Int,2,3,4,5,6,7,8,9,10]
children <- reproduce parents
print children
-- concat monadic
reproduce :: (MonadRandom m) => (VU.Vector Int) -> m (VU.Vector Int)
reproduce parents = return $ VU.concatMap mate mates
where
half = VU.length parents `div` 2
mates = VU.zip (VU.take half parents) (VU.drop half parents)
mate :: (MonadRandom m) => (Int, Int) -> m (VU.Vector Int)
mate (a, b) = do
r1 <- getRandomR(0,5)
r2 <- getRandomR(0,5)
return $ VU.fromList [a+r1, b+r2]
Run Code Online (Sandbox Code Playgroud)
虽然mate示例中的函数实际上并不依赖于获取值的元组,但示例所依据的实际代码却是如此.
Monad m => (a -> m (Vector b)) -> Vector a -> m (Vector b)是不是太困难的-我们可以依靠的Functor,Monad和Traversable实例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)
Run Code Online (Sandbox Code Playgroud)
对未装箱的向量执行此操作的问题在于,在中间fmap f v步骤中我有一个Vector (m (Vector b))并且没有合理data instance的(也没有必要的相应Monad m => Vector Vector (m (Vector b))类实例).
| 归档时间: |
|
| 查看次数: |
227 次 |
| 最近记录: |