Преобразование строки в кортеж Haskell - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь создать функцию для настольной игры, которая будет считывать позицию на доске в виде строки и преобразовывать ее в координату, которую можно использовать в программе, например, "D4 => (3,3), "F2" => (5,1)".

пока у меня есть это:

getCoord :: String -> Maybe(Int, Int)
getCoord s = 
    let alphas = "ABCDEFGH"
        coord1 = head(s)
        coord2 = tail(s)
    in ((elemIndex coord1 alphas)-1, read(head coord2)-1)

Я все еще изучаю использование Maybe в Haskell и сталкиваюсь с ошибкой:

• Couldn't match expected type ‘Maybe (Int, Int)’
              with actual type ‘(Maybe Int, Integer)’
• In the expression:
    ((elemIndex coord1 alphas) - 1, read (head coord2) - 1)

Буду признателен за помощь в где я могу пойти не так Спасибо!

1 Ответ

2 голосов
/ 17 апреля 2020

Проблема, с которой вы сталкиваетесь, заключается в том, что elemIndex возвращает Maybe Int. Поскольку вы также пытаетесь вернуть тип Maybe, лучший способ работать с ним - использовать блок do для выполнения операций внутри монады Maybe. Это позволяет вам использовать Maybe значения, как если бы они были нормальными значениями до тех пор, пока ваш вывод будет упакован обратно в Maybe. (Если вам нужна дополнительная информация о том, как работают монады, здесь есть множество хороших ответов, объясняющих это, и множество других замечательных постов по всему rnet.)

import Text.Read (readMaybe)
import Data.List (elemIndex)

getCoords :: String -> Maybe(Int, Int)
getCoords (coord1:coord2) = do
  let alphas = "ABCDEFGH"
  row <- elemIndex coord1 alphas
  col <- readMaybe coord2
  return (row, col - 1)
getCoords _ = Nothing

Обратите внимание на пару других отличий Ваш оригинал.

  1. Использование readMaybe вместо read. readMaybe - это специальная версия read, которая возвращает значение типа Maybe a. Поскольку мы уже работаем в контексте Maybe, лучше получить возврат без разбора Nothing, чем выдавать ошибку.

  2. Нет - 1 в строке. elemIndex уже имеет желаемое поведение, т. Е. A вернет 0 и т. Д. c.

  3. Соответствие шаблону вместо head и tail. Это позволяет учесть случай, когда строка пуста.

  4. Дополнительное определение для соответствия пустому списку и возврата Nothing. Преимущество использования типа Maybe состоит в том, что вы можете возвращать значение для ошибок вместо получения ошибки времени выполнения. Чтобы использовать это, мы должны убедиться, что мы обрабатываем все дела.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...