2014-11-17 4 views
3

Я пытаюсь нарисовать список объектов, но не могу заставить его работать. Вторичный вопрос: как создать «цикл цикла» с помощью ELM.Elm drawing over list

У меня есть

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 = ????? 

Я пытаюсь получить somethign Лика этой работы

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

Вы ищете функцию 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) 
+0

Это не работает, когда yuo рисует разные объекты. Прояснить. У меня есть еще один список, чтобы показать, скажем, это еще один список автомобилей. основной = коллаж 400 400 [(дисплейCars некоторые автомобили)] ++ [дисплейCars некоторыеCars2] это не работает. не знаю почему. Кроме того, это не два набора машин, которые мне нужно показать, но другие типы объектов :(Я наткнулся на карту, но не смог заставить ее работать – user1639926

+0

Похоже, что здесь есть порядок оценки. Работает ли она, если вы делаете 'main = collage 400 400 ([(displayCars someCars)] ++ [displayCars someCars2])'? – Joe

+0

Кроме того, система типа Elms не позволит вам иметь список, содержащий два разных типа. Однако, если у вас есть функции отображения для каждого типа вы должны иметь возможность использовать 'map' для преобразования каждого в' [Form] ', а затем объединить эти списки. – Joe

Смежные вопросы