Как вывести значение из монады в Хаскеле? - PullRequest
12 голосов
/ 06 сентября 2011

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

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

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

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

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

doSomeThingWithThings :: [Thing] -> Something

Я гуглил это и ничего не нашел.

Ответы [ 2 ]

16 голосов
/ 06 сентября 2011

Вы не должны выходить из монады IO таким образом (кроме функции unsafePerformIO), но вы все равно можете использовать свою функцию внутри нее:

process :: MonadIO m => m ()
process = do
          elems <- getAllThings
          let smth = doSomeThingWithThings elems
          -- ...
2 голосов
/ 06 сентября 2011

После elems <- query GetThings элементы имеют значение [Thing], поэтому <- внутри делает для извлечения вещей из монады (называемой операцией связывания).Последнее утверждение return помещает вещи в монаду.Так что либо вы можете вызывать другую функцию после получения элементов и до return, либо когда вы звоните getAllThings, вы можете извлечь значение из монады <- и передать его в вашу функцию

...