52700.fb2
( Game. hs, interpreted )
[2 of 2] Compiling Loop
( Loop. hs, interpreted )
Loop. hs:46:28:
Ambiguous occurrence ‘Left’
It could refer to either ‘Prelude.Left’,
imported from ‘Prelude’ at Loop. hs:1:8-11
(and originally defined in ‘Data.Either’)
or ‘Game.Left’,
imported from ‘Game’ at Loop. hs:5:1-11
(and originally defined at Game. hs:10:25-28)
Loop. hs:47:28:
Ambiguous occurrence ‘Left’
...
...
Failed, modules loaded: Game.
*Game>
По ошибкам видно, что произошёл конфликт имён. Конструкторы Left и Right уже определены в Prelude.
Это конструкторы типа Either. Давайте скроем их, добавим в модуль такую строчку:
import Prelude hiding (Either(.. ))
Пятнашки | 209
Теперь проверим:
*Game> :r
[2 of 2] Compiling Loop
( Loop. hs, interpreted )
Ok, modules loaded: Game, Loop.
*Loop>
Всё работает, можно двигаться дальше.
Последние штрихи
В модуле Loop нам осталось определить несколько маленьких функций. Поиск по слову un говорит нам
о том, что осталось определить функции “
greetings
:: IO ()
readInt
:: String -> Maybe Int
showAsk
:: IO ()
Самая простая это функция showAsk, она приглашает игрока сделать ход:
showAsk :: IO ()
showAsk = putStrLn ”Ваш ход: ”
Теперь функция распознавания целого числа:
import Data.Char (isDigit)
...
readInt :: String -> Maybe Int
readInt n
| all isDigit n = Just $ read n
| otherwise
= Nothing
В первой альтернативе мы с помощью стандартной функции isDigit :: Char -> Bool проверяем, что