Вот упрощенная версия моего кода:
data Bookmark = Bookmark {
url :: String
, label :: String
} deriving (Show)
genBookmark :: String -> String -> IO Bookmark
genBookmark u l = return ( Bookmark { url = u, label = l } )
Но строки (url, label) находятся в базе данных, поэтому мне приходится иметь дело с IO String.Должно быть, у меня очень простое решение, но я его не вижу (а обширный поиск в Интернете никуда меня не привел).
В основном я хочу изменить свой код на:
genBookmark :: IO String -> IO String -> IO Bookmark
Вот еще одна версия, иллюстрирующая проблему:
genBookmark2 :: String -> String -> Bookmark
genBookmark2 u = return ( Bookmark { url = u, label = newlabel } )
where newlabel = getLine
С ошибкой «Ожидаемый тип: String, Фактический тип: IO String».
====== EDIT =======
Вот "реальный код" с ошибкой (с решением, которое я получил из ответа):
getSkosConceptRight :: String -> IO SkosConcept
getSkosConceptRight catName = do
suConcepts <- getSubConcepts catName
concept <- getMainConcept catName
return ( concept { subConcepts = suConcepts })
getSkosConceptWrong :: String -> IO SkosConcept
getSkosConceptWrong catName = return ( concept { subConcepts = suConcepts })
where suConcepts = getSubConcepts catName
concept = getMainConcept catName
getMainConcept :: ShortUrl -> IO SkosConcept
getSubConcepts :: ShortUrl -> IO [SkosConcept]