extractPatternStrings ∷ IO [(Map String SqlValue)] → IO [String]
IO [String]
- это действие ввода-вывода, которое дает результат [String]
.Использование нотации do гарантирует, что extractPatternStrings
создаст IO [String]
, а не [String]
.
. IO [(Map String SqlValue)]
- это действие ввода-вывода, которое приводит к результату [Map String SqlValue]
.Но вы не можете сопоставить шаблон с действием ввода-вывода.Синтаксис, который вы используете, предназначен для прямого сопоставления со списком, а не с действием ввода-вывода, которое создает список.
Вместо этого следует использовать подпись этого типа:
extractPatternStrings ∷ [Map String SqlValue] → IO [String]
За исключением этого, как @Пропущенный не указывает, что это не должно быть действие ввода-вывода:
extractPatternStrings ∷ [Map String SqlValue] → [String]
extractPatternStrings [] = []
extractPatternStrings (m:ms) = toString m : extractPatternStrings ms
where
toString ∷ Map String SqlValue → String
toString m = (fromSql . fromJust . (Map.lookup "word"))∷ String
Или, что лучше (и исправление ошибки в toString
):
extractPatternStrings ∷ [Map String SqlValue] → [String]
extractPatternStrings = map toString
where
toString ∷ Map String SqlValue → String
toString = fromSql . fromJust . Map.lookup "word"
Более кратко:
extractPatternStrings ∷ [Map String SqlValue] → [String]
extractPatternStrings = map (fromSql . fromJust . Map.lookup "word")
Если вы действительно должны иметь оригинальную подпись, то используйте liftM
, либо изменив свой код вызова на selectAll ↠ liftM extractPatternStrings
(и я должен признаться, я не узнаю оператора, которого вы там используете)или определив extractPatternStrings
как
extractPatternStrings ∷ IO [Map String SqlValue] → IO [String]
extractPatternStrings = liftM $ map (fromSql . fromJust . Map.lookup "word")
Но я рекомендую первое.