52700.fb2 Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 233

Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 233

[1 of 2] Compiling Game

( 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 проверяем, что