Подтвердить что ты не робот

Как вывести ценность из монады в Хаскелле?

Есть ли способ взять "вещи" из монады?

Я разрабатываю игру, и теперь я пытаюсь понять о базах данных. Я нашел happstack действительно красиво, но я не могу это понять.

Например, у меня есть эта функция (надеюсь, что вы знакомы с happstack)

getAllThings :: MonadIO m => m [Thing]
getAllThings = do
            elems <- query GetThings
            return elems

Итак, я получаю m [Things], но я не могу использовать это в своей модели! Например,

doSomeThingWithThings :: [Thing] -> Something

Я искал это, и ничего не нашел.

4b9b3361

Ответ 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, вы можете использовать извлечение значения с помощью <- из монады и передать ее вашей функции