Как вывести ценность из монады в Хаскелле?
Есть ли способ взять "вещи" из монады?
Я разрабатываю игру, и теперь я пытаюсь понять о базах данных. Я нашел happstack
действительно красиво, но я не могу это понять.
Например, у меня есть эта функция (надеюсь, что вы знакомы с happstack
)
getAllThings :: MonadIO m => m [Thing]
getAllThings = do
elems <- query GetThings
return elems
Итак, я получаю m [Things]
, но я не могу использовать это в своей модели! Например,
doSomeThingWithThings :: [Thing] -> Something
Я искал это, и ничего не нашел.
Ответы
Ответ 1
Вы не должны выходить из IO monad таким образом (кроме функции unsafePerformIO
), но вы все равно можете использовать свою функцию внутри него:
process :: MonadIO m => m ()
process = do
elems <- getAllThings
let smth = doSomeThingWithThings elems
-- ...
Ответ 2
После elems <- query GetThings
элементы [Thing]
, поэтому <-
внутри do - это получение вещей из монады (операция привязки). Последнее утверждение return
помещает вещи внутри монады. Таким образом, либо вы можете называть вас другой функцией после получения элем и до return
, либо когда вы звоните getAllThings
, вы можете использовать извлечение значения с помощью <-
из монады и передать ее вашей функции