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

Gue*_*OCs 1 postgresql haskell functional-programming

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

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

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]
Run Code Online (Sandbox Code Playgroud)

怎么可能"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)
Run Code Online (Sandbox Code Playgroud)

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

Fyo*_*kin 8

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

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

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