Чтобы ответить на общий вопрос в общих чертах, способ only для извлечения значений из конструктора данных - это сопоставление с образцом.Некоторые типы данных поставляются с функциями, которые извлекают значения для вас, но сами эти функции реализуются с помощью сопоставления с образцом или вызывают другие функции, & c.Абстрактные типы данных, такие как Data.Map.Map
или IO
, которые хотят скрыть свою внутреннюю структуру, все еще требуют сопоставления с образцом для работы;Разница в том, что они не экспортируют свои конструкторы из модуля, который их определяет, поэтому вам нужно работать только с другими функциями, определенными в модуле, и выполняемыми ими операциями.
Чтобы ответить на конкретный вопрос,ReadS
определяется как так:
type ReadS a = String -> [(a, String)]
Так что это просто синоним типа.Вам не нужно ничего извлекать из самого ReadS
, это просто сокращение или псевдоним.Фактический тип - [(a, String)]
, с которым вы можете работать так же, как и с любым другим, используя списки, кортежи, String
s и т. Д.
Кроме того, ReadS
не является Monad
.Это синоним типа для чего-то, что не является экземпляром Monad
, и фактически не может быть непосредственно преобразовано в один (нет способа написать [(a, String)]
в форме, необходимой для объявления экземпляра).