Haskell opalye通过字符串查询到Maybe

Haskell opalye通过字符串查询到Maybe,haskell,opaleye,Haskell,Opaleye,我想对我的表运行一个给定值的查询,并根据是否找到一行返回一个可能是一个 我有这个域名: data User' a b c d e f = User { usrId :: a, usrApproved :: b, usrIden :: c, usrImgUrl :: d,

我想对我的表运行一个给定值的查询,并根据是否找到一行返回一个
可能是一个

我有这个域名:

data User' a b c d e f = User {  usrId :: a,
                                     usrApproved :: b,
                                     usrIden :: c, 
                                     usrImgUrl :: d,
                                     usrTitle :: e, 
                                     usrUrl :: f 
                                  }

type User = User' Int Bool String String String String

$(makeAdaptorAndInstance "pUser" ''User')

type UserColumn = User' (Column PGInt4) (Column PGBool) (Column PGText) (Column PGText) (Column PGText) (Column PGText) 
以及表和查询的以下定义:

userTable :: Table UserColumn UserColumn
userTable = Table "user" (pUser User {  usrId       = required "id",
                                                usrApproved = required "approved",
                                                usrIden     = required "identifier",
                                                usrImgUrl   = required "img_url",
                                                usrTitle    = required "title",
                                                usrUrl      = required "url"
                                             })

userQuery :: Query UserColumn
userQuery = queryTable userTable
正如前面所暗示的,我希望通过“identifier”列进行查询,因此我编写了这个查询并希望返回一个`IO(可能是用户)

userByIdenQuery::(Column PGText)->Query UserColumn
userByIdenQuery iden=proc()->do
用户PGS.Connection->IO(可能是用户)
getUserByIden-iden c=do
usr
违约
P
(用户'a1_0 a2_0 a3_0 a4_0 a5_0 a6_0)
(用户'a1_1 a2_1 a3_1 a4_1 a5_1 a6_1)
--定义于src\DB.hs:33:3
在“do”块的stmt中:

usr我不熟悉OpalEye,但我认为您可能需要明智地使用
listToMaybe
导入数据。可能(listToMaybe)

getUserByIden::String->PGS.Connection->IO(可能是用户)
getUserByIden-iden c=do
listToMaybe runQuery c(UserByIdQuery$pgString-iden)

我不熟悉OpalEye,但我认为您可能只需要明智地使用
listToMaybe
导入数据。可能(listToMaybe)

getUserByIden::String->PGS.Connection->IO(可能是用户)
getUserByIden-iden c=do
listToMaybe runQuery c(UserByIdQuery$pgString-iden)

我认为问题在于您在函数的末尾使用了
未定义的
。由于某些复杂的类型级别magic Opaleye正在幕后进行操作,您需要指定一个类型以使用
runQuery
,或者只返回生成的值而不是未定义的值,因为未定义会稍微偏离顶级推理算法:

getUserByIden :: String -> PGS.Connection -> IO (Maybe User)
getUserByIden iden c = listToMaybe <$> runQuery c (userByIdenQuery $ pgString iden)
getUserByIden::String->PGS.Connection->IO(可能是用户)
getUserByIden-iden c=listToMaybe runQuery c(userByIdenQuery$pgString-iden)

我还添加了一个
listToMaybe
调用来更改函数体的类型,以匹配您指定的返回类型
runQuery
完全应用时,返回类型为
IO[SomeHaskellType]
的值,而不是
IO(可能是SomeHaskellType)

我认为问题在于您在函数
getUserByIden
的末尾使用
undefined
。由于某些复杂的类型级别magic Opaleye正在幕后进行操作,您需要指定一个类型以使用
runQuery
,或者只返回生成的值而不是未定义的值,因为未定义会稍微偏离顶级推理算法:

getUserByIden :: String -> PGS.Connection -> IO (Maybe User)
getUserByIden iden c = listToMaybe <$> runQuery c (userByIdenQuery $ pgString iden)
getUserByIden::String->PGS.Connection->IO(可能是用户)
getUserByIden-iden c=listToMaybe runQuery c(userByIdenQuery$pgString-iden)

我还添加了一个
listToMaybe
调用来更改函数体的类型,以匹配您指定的返回类型
runQuery
完全应用时,返回类型为
IO[SomeHaskellType]
的值,而不是
IO(可能是SomeHaskellType)

runQuery
有一个非常通用的返回类型-给它一个类型签名,或者给它一个返回值一个类型签名。声明非常明确地指出:“runQuery使用默认的typeclass意味着编译器在推断类型时会遇到困难。强烈建议您在使用runQuery时提供完整的类型签名。”如何准确地提供类型签名?黑线鳕总是让我感到困惑。从某种意义上说,你已经给了它一个类型签名-
getUserByIden::String->PGS.Connection->IO(可能是用户)
-但是
usr
在主体中没有使用,所以它不能与
User
统一。如果您实际实现了该功能,它可能就足够了。同时,您可以通过多种方式编写类型签名:
(x::x)@atc您找到了令人满意的解决方案吗?如果你不想直接问我,你可以直接问。谢谢汤姆,我问了。公认的答案是正确的。如果能在教程中介绍这一点会很好,但这是我的学究:)
runQuery
有一个非常通用的返回类型-给它一个类型签名,或者给它一个返回值一个类型签名。声明非常明确地指出:“runQuery使用默认的typeclass意味着编译器在推断类型时会遇到困难。强烈建议您在使用runQuery时提供完整的类型签名。”如何准确地提供类型签名?黑线鳕总是让我感到困惑。从某种意义上说,你已经给了它一个类型签名-
getUserByIden::String->PGS.Connection->IO(可能是用户)
-但是
usr
在主体中没有使用,所以它不能与
User
统一。如果您实际实现了该功能,它可能就足够了。同时,您可以通过多种方式编写类型签名:
(x::x)@atc您找到了令人满意的解决方案吗?如果你不想直接问我,你可以直接问。谢谢汤姆,我问了。公认的答案是正确的。如果能在教程中涵盖这一点会很好,但这是我的学究作风:)谢谢。另一个答案(类似的内容)是在你之前发布的,所以我接受了他们的答案。谢谢你的帮助!谢谢另一个答案(类似的内容)是在你之前发布的,所以我接受了他们的答案。谢谢你的帮助!
getUserByIden :: String -> PGS.Connection -> IO (Maybe User)
getUserByIden iden c = do
  (usrId, appr, idn, imUrl, tit, url) <- runQuery c (userByIdenQuery $ pgString iden)
  return $ Just $ User usrId appr idn imUrl tit url
Couldn't match expected type `[haskells0]'
        with actual type `(Int, Bool, String, String, String, String)'
In the pattern: (usrId, appr, idn, imUrl, tit, url)
In a stmt of a 'do' block:
  (usrId, appr, idn, imUrl, tit, url) <- runQuery
                                          c (userByIdenQuery $ pgString iden)
In the expression:
  do { (usrId, appr, idn, imUrl, tit, url) <- runQuery
                                               c (userByIdenQuery $ pgString iden);
       return $ Just $ User usrId appr idn imUrl tit url }

I really have no idea where to go with this, other than using a library other than Opaleye.
getUserByIden :: String -> PGS.Connection -> IO (Maybe User)
getUserByIden iden c = do
  listToMaybe <$> runQuery c (userByIdenQuery $ pgString iden)
getUserByIden :: String -> PGS.Connection -> IO (Maybe User)
getUserByIden iden c = listToMaybe <$> runQuery c (userByIdenQuery $ pgString iden)