Как анимировать что-то в Code World Haskell?

#haskell #codeworld

#haskell #codeworld

Вопрос:

Я начинающий программист, и я прохожу курс средней школы под названием «Введение в вычислительное мышление». Мы изучаем Haskell с помощью Code World, онлайн-среды разработки. Наше задание — нарисовать несколько воздушных змеев и заставить их немного двигаться. Однако мой учитель не очень полезен, а документация ужасна. Компилятор также выдает сообщения об ошибках, которые для меня не имеют особого смысла. Я знаю, что мне нужно либо определить два или более фрейма, либо переключаться между ними в цикле, но я не могу понять, как это сделать. Существует также функция с именем animationOf, но я тоже не могу понять, как ее использовать. Даже если я скопирую пример, найденный на другом веб-сайте, и попытаюсь вставить его в Code World, чтобы протестировать, будет масса синтаксических ошибок.

Например, это не будет компилироваться, даже если я переименую переменные в соответствии со своими переменными или попытаюсь написать свою собственную функцию следующим образом:

 trafficController :: Double -> Picture
   trafficController t
     
     | round (t/3) `mod` 2 == 0 = trafficLight True
     
     | otherwise                = trafficLight False

main :: IO ()
main = animationOf trafficController
 

Это с веб-сайта Haskell, и это даже не тот же синтаксис. Я не понимаю, какую «версию» Haskell мы даже изучаем в школе, потому что она, по-видимому, отличается от каждого веб-сайта, на который я смотрю о Haskell. Например, мы используем program = drawingOf(whatever) и не используем main . Он также сообщает мне о странных ошибках, когда я пытаюсь создать свою собственную функцию, например «Double не входит в область видимости», что для меня не имеет смысла. Если у меня есть import Standard , я думаю, что базовые типы, такие как Double, должны существовать и использоваться. Есть ли другая библиотека, которую я должен импортировать?

Я попытался определить два фрейма следующим образом:

 frame1 = [ kite(3,6,"red"), kite(-5,5,"purple"), kite(3,-5,"lightpink"),
          stickfig, painted(solidRectangle(20,20),"sky blue")]

frame2 = [ kite(3.5,6.5,"red"), kite(-4.5,4.5,"purple"), kite(3.5,-5.5,"lightpink"),
          stickfig, painted(solidRectangle(20,20),"sky blue")]
 

Если я создам массив фреймов, подобных combined[ frame1,frame2 ] , я подумал, что могу переключаться между этими двумя, чтобы создать простую анимацию перемещения воздушных змеев. Однако я даже не могу понять, как создать цикл для этого, потому что язык кажется мне таким неудобным, а документация и примеры довольно бесполезны. Я пробовал читать эту документацию здесь, и это совсем не помогает:

https://hackage.haskell.org/package/codeworld-api-0.3.1/docs/CodeWorld.html

Я также понятия не имею, как использовать animationOf , и документация не дает ответов, а примеры, которые я нахожу в Google, не работают, как бы я ни пытался их модифицировать или писать свои собственные версии, следуя синтаксису, который они показывают.

Также кто-нибудь знает, какую версию Haskell они заставляют нас изучать и почему она отличается от других версий, которые я вижу. И есть ли какие-нибудь лучшие ресурсы для изучения этого материала, потому что наша документация и примеры ужасны.

Комментарии:

1. Вы говорите, что получаете ошибки. В чем ошибки? Изучение того, как их читать, является частью изучения Haskell. Приведенный выше код отформатирован неправильно, вы уверены, что именно так вы его разместили в IDE? Вы не должны делать отступы в определении функции подобным образом.

2. Пожалуйста, отредактируйте вопрос, чтобы ограничить его конкретной проблемой с достаточной детализацией для определения адекватного ответа.

Ответ №1:

Вот первая проблема. CodeWorld — это образовательная среда программирования, реализованная на Haskell. Он поставляется в двух вариантах: «CodeWorld», который позволяет вам программировать на модифицированном образовательном варианте языка Haskell, который в некоторых отношениях похож на Haskell, но имеет другой синтаксис; и «CodeWorld Haskell», который позволяет вам программировать на стандартном Haskell.

Версия доступна по адресу https://code .world /, и тот, который вы, похоже, используете, — это обычный старый «CodeWorld» вместо «CodeWorld Haskell». («CodeWorld Haskell» можно получить по адресу https://code .world / haskell», если хотите). Лучшим источником документации по этому простому старому языку «CodeWorld» является CodeWorld Guide, к которому вы можете получить доступ, нажав на кнопку «Guide» в нижней части CodeWorld IDE.

Вы используете animationOf , определяя функцию, которая принимает значение времени и отображает изображение на основе этого времени. Затем вы вызываете animationOf эту функцию и animationOf заботитесь о том, чтобы показывать кучу кадров в выбранные моменты времени для создания анимации.

Итак, если вы действительно хотите просмотреть некоторые конкретные кадры в цикле, вам нужно вычислить номер кадра за определенное время. Например, следующая функция циклически перебирает те же три номера кадров от «1» до «3» каждые две секунды:

 framenum(t) = floor(remainder(t/secs, 1)*totalframes) 1
 where
  totalframes = 3
  secs = 2
 

Затем вы можете использовать его для написания функции, которая выбирает из списка фреймов примерно так, опять же на основе заданного значения времени:

 showframe(t) = allframes # framenum(t)
  where
   allframes = [rectangle(4,1), circle(1), rectangle(1,4)]
 

а затем определите свою программу как анимацию, основанную на этой showframe функции:

 program = animationOf(showframe)
 

Однако это довольно неудобный способ анимации. Вместо циклического перебора множества кадров, вы на самом деле должны написать функцию, которая отображает сцену так, как она должна выглядеть в определенное время, вообще не думая о кадрах. Например, если вы хотите, чтобы мяч отскакивал по экрану, вы можете определить его позиции «x» и «y» как функции времени:

 x(t) = t*2
y(t) | t < 1 = -10*(t-1)*(t 1)
     | t < 2 = -10*(t-1)*(t-2)
     | t < 2.5 = -10*(t-2)*(t-2.5)
     | otherwise = 0
 

Затем вы можете написать функцию, которая отображает шар в правильном месте на основе этого значения времени:

 ball(t) = translated(circle(1),x(t),y(t))
 

и, наконец, вы можете передать эту функцию animationOf и назвать ее своей программой:

 program = animationOf(ball)
 

Раздел «Часть 3: изменение» Руководства содержит много примеров анимации такого рода.

Вот две полные программы, которые должны работать, если вырезать и вставить точно в IDE в https://code .мир /

Программа # 1: Фреймы

 framenum(t) = floor(remainder(t/secs, 1)*totalframes) 1
 where
  totalframes = 3
  secs = 2

showframe(t) = allframes # framenum(t)
  where
   allframes = [rectangle(4,1), circle(1), rectangle(1,4)]

program = animationOf(showframe)
 

Программа # 2: Мяч

 x(t) = t*2
y(t) | t < 1 = -10*(t-1)*(t 1)
     | t < 2 = -10*(t-1)*(t-2)
     | t < 2.5 = -10*(t-2)*(t-2.5)
     | otherwise = 0

ball(t) = translated(circle(1),x(t),y(t))

program = animationOf(ball)