#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)