Если включить PartialTypeSignatures
, вы можете написать:
query_ "select * from books" >>= (writeJSON :: [Book] -> _)
Можно было бы также означать это как ограничение на query_
; например в вашей версии do
, было бы:
listBooks :: AppHandler()
listBooks = do
results <- query_ "select * from books" :: _ [Book]
writeJSON results
В будущих версиях GHC, также будет видно приложение типа. Если предположить, что writeJSON
или query_
имеет соответствующее объявление типа, вы бы тогда быть в состоянии написать один из них:
query_ @[Book] "select * from books" >>= writeJSON
query_ "select * from books" >>= writeJSON @[Book]
Наконец, если вы не склонны к типу аннотаций, но хорошо с термином аннотацией, вы могли бы написать
query_ "select * from books" >>= asAppliedTo [Book{}] writeJSON
где Book
- гипотетический конструктор для типа Book
(точка [Book{}]
, в то время как бессмысленное значение имеет мономорфный тип). Я, кажется, помню, что asAppliedTo
- это стандартная вещь, но быстрый hoogle не раскрывает ее; в любом случае он реализуется аналогично этому:
asAppliedTo :: arg -> (arg -> result) -> (arg -> result)
asAppliedTo _ = id
Вам нужно указать тип либо с помощью встроенной аннотации, либо с подписями в отдельном определении. Кстати, есть [запланированное расширение GHC] (https://ghc.haskell.org/trac/ghc/ticket/10803), которое обеспечит синтаксический сахар для вашего второго фрагмента. – duplode