Рассмотрим тип
data MyBool a = TRUE | FALSE
Обратите внимание, что MyBool a
на самом деле не зависит от a
, но давайте сделаем это просто для удовольствия.
Теперь представьте, что я хочу определить функцию isParsable :: (Read a) => String -> MyBool a
, которая решает, может ли данная строка обрабатываться как a
, и выводит результат как MyBool a
.
Естественно, я хочу написать:
isParsable :: (Read a) => String -> MyBool a
isParsable str
| (null parses) = FALSE
| (otherwise) = TRUE
where parses = (reads str)::[(a, String)]
Сейчас это не компилируется, но я не совсем понимаю, почему. Я не думаю, что эта функция неоднозначна, потому что любой вызов isParsable
должен был бы вызвать выбор a
и, следовательно, убедиться, что ограничение Read a
выполнено, поскольку оно прямо в сигнатуре типа. Кроме того, where
оговорка заставляет reads :: String -> [(a, String)]
. Но по какой-то причине GH C выдает ошибку.
Что я здесь недопонимаю и как можно это обойти?