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)