私は自分自身にhaskellをよりよく教えるために、群れのシミュレーションをしようとしています。ランダム性を必要とするシミュレーションの初期状態を生成しようとすると、問題が発生します。すべてランダムな初期位置と方向を持つボイドのリストを生成しようとしています。
メイン関数では、これを使用して呼び出します
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 }
私はここでかなり迷っています。関数型言語(およびモナド)の命令型コード全体についての私の理解は控えめに言っても不安定です。どんな助けでも大歓迎です!