【发布时间】:2012-04-21 07:57:06
【问题描述】:
我正在尝试进行集群模拟,以便更好地自学haskell。在尝试为需要随机性的模拟生成初始状态时,我遇到了麻烦。我正在尝试生成所有具有随机初始位置和方向的 Boid 列表。
在主函数中我使用
let numBoids = 10
rBoids <- randomBoids numBoids
rBoids 我打算将其存储在 IORef 中,然后我可以更新每一帧,我认为这是正确的做法吗?
这是失败的代码:
-- Type for the flocking algorithm
data Boid = Boid {
boidPosition :: Vector2(GLfloat)
, boidDirection :: Vector2(GLfloat)
} deriving Show
randomBoids :: Int -> IO ([Boid])
randomBoids 0 = do
return []
randomBoids n = do
b <- randomBoid
bs <- (randomBoids (n-1))
return b : bs
randomBoid = do
pos <- randomVector
vel <- randomVector
return (Boid pos vel)
randomVector = do
x <- randomRIO(-1.0, 1.0)
y <- randomRIO(-1.0, 1.0)
return (Vector2 x y)
实际上失败的是return b : bs。如果我将其更改为 return [b] 它会编译。给出的错误是:
Couldn't match expected type `IO [Boid]' with actual type `[a0]'
In the expression: return b : bs
In the expression:
do { b <- randomBoid;
bs <- (randomBoids (n - 1));
return b : bs }
In an equation for `randomBoids':
randomBoids n
= do { b <- randomBoid;
bs <- (randomBoids (n - 1));
return b : bs }
我在这里很迷茫,至少可以说我对整个函数式命令式代码(和 monad)的理解是不稳定的。任何帮助将不胜感激!
【问题讨论】:
-
"return (b:bs)" 而不是 "return b : bs"