Я новичок в Haskell, поэтому у меня возникли проблемы с освоением всех дополнительных функций, используемых в Yesod, таких как экземпляры типов и ограничения равенства. Я пытаюсь реализовать шаблон скобок в тестовой среде Yesod, чтобы получить функциональность setUp/tearDown. Вот что у меня есть (обновлено через редактирование):
module FishMother where
import Control.Exception.Lifted
import TestImport
import Database.Persist
import Database.Persist.GenericSql
import Model
insertYellowfinTuna :: OneSpec Connection FishId
insertYellowfinTuna = runDB . insert $ Fish "Yellowfin Tuna"
deleteFish :: FishId -> OneSpec Connection ()
deleteFish = runDB . delete
withYellowfinTuna :: FishId -> OneSpec Connection ()
withYellowfinTuna = bracket insertYellowfinTuna deleteFish
Ошибки компиляции следующие:
tests/FishMother.hs:18:21:
Couldn't match type `FishId
-> Control.Monad.Trans.State.Lazy.StateT
(Yesod.Test.OneSpecData Connection) IO ()'
with `Key SqlPersist Fish'
Expected type: FishId -> OneSpec Connection ()
Actual type: (FishId
-> Control.Monad.Trans.State.Lazy.StateT
(Yesod.Test.OneSpecData Connection) IO ())
-> Control.Monad.Trans.State.Lazy.StateT
(Yesod.Test.OneSpecData Connection) IO ()
In the return type of a call of `bracket'
In the expression: bracket insertYellowfinTuna deleteFish
In an equation for `withYellowfinTuna':
withYellowfinTuna = bracket insertYellowfinTuna deleteFish
Что я делаю неправильно?
IO
, у вас были бы функцииsetup :: IO FishId
,tearDown :: FishId -> IO ()
, а затемwithYellowfinTuna = bracket setup tearDown
. Поэкспериментируйте с пониманием того, каким будет тип этой функции, а затем вернитесь в мир Йесод и попробуйте заменитьIO
монадойOneSpec Connection
. - person Michael Snoyman   schedule 19.01.2013OneSpec Connection
и типами других функций. Вот исправленная подпись типа, которую я искал:withYellowfinTuna :: (FishId -> OneSpec Connection ()) -> OneSpec Connection ()
- person arussell84   schedule 19.01.2013