У меня есть следующий код из purescript-express (но вопрос более общий).Как объединить эти типы?
setHandler :: forall e. Handler e
setHandler = do
idParam <- getRouteParam "id"
send "Yeah! "
appSetup :: forall e. App e
appSetup = do
get "/set/:id" setHandler
setHandler
потребность иметь данную подпись, как get
определяется как
> :t get
forall e r.
(RoutePattern r) => r
-> HandlerM (express :: EXPRESS | e) Unit
-> AppM (express :: EXPRESS | e) Unit
Однако теперь я хочу использовать следующую функцию в setHandler
getPointsSet :: forall f. String -> Aff (fs :: FS | f) Foobar
, который даст мне следующее ошибка компилятора
[1/1 TypesDoNotUnify] src/Main.purs:31:5
v
31 send "Yeah! "
^
Could not match type
HandlerM
with type
Aff
while trying to match type HandlerM
(express :: EXPRESS
| _2
)
with type Aff
(fs :: FS
| _0
)
while checking that expression send "Yeah! "
has type Aff
(fs :: FS
| _0
)
_1
in value declaration setHandler
Я понимаю, что использование getPointsSet
требует, чтобы setHandler также стал Aff
, но я не могу подключить его к get
.
Редактировать
Если я пытаюсь добавить liftAff
как это было предложено в ответ ниже
setHandler :: forall e. Handler e
setHandler = do
idParam <- getRouteParam "id"
liftAff $ getPointsSet "../some-data.csv"
send "Yeah! "
Я получаю следующую ошибку
[1/1 NoInstanceFound] src/Main.purs:28:1
28 setHandler :: forall e. Handler e
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
No type class instance was found for
Control.Monad.Aff.Class.MonadAff (fs :: FS | _0)
(HandlerM (express :: EXPRESS | e0))
The instance head contains unknown type variables. Consider adding a type annotation.
in value declaration setHandler
Что мне нужно сделать, чтобы разрешить это?
yup - все было. Сорт ;-) на самом деле то, что работает, просто не имеет подписи для setHandler – robkuz