Вы почти на месте, вам просто нужна функция read , чтобы преобразовать строку пользователя в тип данных RPS
.
Первое, что вам нужно сделать, это сделать RPS
экземпляром класса типов Read
. Это можно легко сделать, внеся изменения в data
декларацию:
data RPS = Rock | Paper | Scissors deriving Read
то, что делает deriving Read
, дает RPS
экземпляр по умолчанию класса типов Read
, который работает очевидным образом: read "Rock"
станет Rock
и так далее, при условии, что компилятор знает, что вы используете read
в контексте, где ожидается значение типа RPS
.
Тогда все, что вам нужно сделать в функции main
, это изменить это:
putStrLn (_shoot choice Rock)
до
putStrLn (_shoot (read choice) Rock)
Так как _shoot
имеет сигнатуру типа, сообщающую GHC, что его первый аргумент должен быть значением RPS
, он будет знать, использовать ли экземпляр read
, определенный для вашего типа RPS
, и все должно быть в порядке, так как вы уже ограничили допустимый выбор пользователя этими 3 конкретными строками.
(Обратите внимание, что для более крупных программ существуют более безопасные и более эффективные способы обработки подобных вещей - см. Ответ Виллема для одного простого подхода - но это хорошо для базового учебного упражнения.)