在这个简单的postgresql示例中,“SELECT1+1”::IO[OnlyInt]如何成为Query类型?

我试图在haskell中理解这个简单的postgresql示例

main :: IO ()
main = do
  conn <- connect localPG
  mapM_ print =<< (query_ conn "SELECT 1 + 1" :: IO [Only Int])

https://hackage.haskell.org/package/postgresql-simple-0.4.10.0/docs/Database-PostgreSQL-Simple.html#v:query _

 query_ :: FromRow r => Connection -> Query -> IO [r]

怎么可能"SELECT 1 + 1" :: IO [Only Int]Query?

查看类型Query https://hackage.haskell.org/package/postgresql-simple-0.4.10.0/docs/src/Database-PostgreSQL-Simple-Types.html#Query的来源对我没有帮助:

newtype Query = Query {
      fromQuery :: ByteString
    } deriving (Eq, Ord, Typeable)

我没有看到IO [Only Int]和之间的联系Query

回答

类型注释IO [Only Int]适用于整个表达式query_ conn "SELECT 1 + 1",而不仅仅是它的最后一个参数。

字符串"SELECT 1 + 1"本身可以是类型,Query因为该类型Query具有 的实例IsString

这就是字符串文字在 Haskell 中的工作方式(前提OverloadedStrings是打开):字符串文字具有 type IsString a => a,编译器使用该fromString方法将实际字符串转换为预期类型。


以上是在这个简单的postgresql示例中,“SELECT1+1”::IO[OnlyInt]如何成为Query类型?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>