3

オブジェクトのリストを描画しようとしていますが、機能させることができません。二次的な質問は、ELM を使用して「for ループ」を作成する方法です。

私は

type Object a = { a | x:Float, y:Float, vx:Float, vy:Float }
type Car  = Object {}
type Cars = [Car]

displayCar =  move (car.x,car.y) (filled white (rect 30 20))
displayCars = ?????

私はこれを機能させるために何かを取得しようとしています

collage 100 100 [displayCar (head cars) -- does work
                 , displayCars cars -- does not work

                ]

特に、コラージュには、プロットする必要があるものが複数あります。

   [ filled pongGreen   (rect gameWidth gameHeight)
   , displayObjHouse (game.houses !! 0) -- so ugly code
   , displayObjHouse (game.houses !! 1) -- so ugly code
   , displayObjHouse (game.houses !! 2) -- so ugly code
   , displayObjHouse (game.houses !! 3) -- so ugly code
   , displayObjHouse (game.houses !! 4) -- so ugly code
   , displayCars cars -- does not work  
   ]
4

1 に答える 1

4

関数 を探していますmap

map : (a -> b) -> [a] -> [b]

これは、ある関数をリストに適用して、結果のリストを取得できることを意味します。

あなたはここにあるものに非常に近いです。あなたが進歩し続けるのを助けるために、私はいくつかの空白を埋めました!幸運を!

type Object a = { a | x:Float, y:Float, vx:Float, vy:Float }
type Car = Object {}
type House = Object { residents : Int }

displayCar : Car -> Form
displayCar car =  move (car.x,car.y) (filled black (rect 30 20))

displayCars : [Car] -> [Form]
displayCars cars = map displayCar cars

-- map : (a -> b) -> [a] -> [b]
-- In our particular example, we plug in our functions
-- displayCar : Car -> Form
-- since display car is the first argument to map, all a's become Car
-- and all b's become Form
-- So the type of map in this instance is ((Car -> Form) -> [Car] -> [Form]

someCars : [Car]
someCars = [ { x = 100, y = 10, vx = 0, vy = 0 }
           , { x = 35, y = 100, vx = 0, vy = 0 }
           , { x = 0, y = 0, vx = 0, vy = 0 }
           ]

someHouses : [House]
someHouses = [ { x = 20, y = -100, vx = 0, vy = 0, residents = 3 }
             , { x = -20, y = -50, vx = 0, vy = 0, residents = 3 }
             , { x = 160, y = -150, vx = 0, vy = 0, residents = 3 }
             ]  

displayHouse : House -> Form
displayHouse house = move (house.x, house.y) (filled blue (rect 30 50))

main : Element
main = 
  let houses = map displayHouse someHouses
      cars   = map displayCar someCars
  in collage 400 400 (houses ++ cars)
于 2014-11-17T21:42:32.183 に答える