我应该如何使用 runDB 函数创建一个 selectFieldList 来获取值?
How should I create a selectFieldList with using runDB function to fetch values?
我想在我的表单中添加一个 selectionFieldList,但不幸的是我无法填充数据库中的值,因为我遇到了编译错误。
我有这样的表单定义:
flowerForm = renderDivs $ FormFlower
<$> areq textField "Flower" Nothing
<*> areq (selectFieldList findAllAsTuple) "Category" Nothing
和 findAllAsTuple 函数:
findAllAsTuple ::[(Text,Text)]
findAllAsTuple = fmap (map (\cat -> (categoryName $ entityVal cat, categoryName $ entityVal cat))) $ runDB $ selectList [] [Asc CategoryName]
但是我得到了这个错误:
Handler\Category.hs:6:18:
Couldn't match type `HandlerT site0 IO' with `[]'
Expected type: [(Text, Text)]
Actual type: HandlerT site0 IO [(Text, Text)]
In the expression:
fmap
(map
(\ cat
-> (categoryName $ entityVal cat, categoryName $ entityVal cat)))
$ runDB $ selectList [] [Asc CategoryName]
In an equation for `findAllAsTuple':
findAllAsTuple
= fmap
(map
(\ cat
-> (categoryName $ entityVal cat, categoryName $ entityVal cat)))
$ runDB $ selectList [] [Asc CategoryName]
如果我删除 fmap,我会收到此错误:
Handler\Category.hs:6:95:
Couldn't match expected type `[Entity Category]'
with actual type `HandlerT site0 IO [Entity Category]'
In the second argument of `($)', namely
`runDB $ selectList [] [Asc CategoryName]'
In the expression:
map
(\ cat
-> (categoryName $ entityVal cat, categoryName $ entityVal cat))
$ runDB $ selectList [] [Asc CategoryName]
In an equation for `findAllAsTuple':
findAllAsTuple
= map
(\ cat
-> (categoryName $ entityVal cat, categoryName $ entityVal cat))
$ runDB $ selectList [] [Asc CategoryName]
我也试过这个方法:
findAllAsTuple ::[(Text,Text)]
findAllAsTuple = do
items <- runDB $ selectList [] [Asc CategoryName]
return $ map (\cat -> (categoryName $ entityVal cat, categoryName $ entityVal cat)) items
但我后来得到了这个:
Handler\Category.hs:8:17:
Couldn't match type `[(Text, Text)]' with `(Text, Text)'
Expected type: [(Text, Text)]
Actual type: [[(Text, Text)]]
In a stmt of a 'do' block:
return
$ map
(\ cat
-> (categoryName $ entityVal cat, categoryName $ entityVal cat))
items
In the expression:
do { items <- runDB $ selectList [] [Asc CategoryName];
return
$ map
(\ cat
-> (categoryName $ entityVal cat, categoryName $ entityVal cat))
items }
In an equation for `findAllAsTuple':
findAllAsTuple
= do { items <- runDB $ selectList [] [Asc CategoryName];
return
$ map
(\ cat
-> (categoryName $ entityVal cat, categoryName $ entityVal cat))
items }
我不明白为什么。如果我像这样编写一个简单的地图函数:
findAllAsTuple ::[(Text,Text)]
findAllAsTuple = map (\cat -> (cat,cat)) ["red","blue","yellow"]
它运行良好,我没有收到任何类型错误。
findAllAsTuple
的类型是 HandlerT site IO [(Text, Text)]
。
您可以通过删除(错误的)类型签名在 GHCI 中检查它。
函数 selectFieldList
应该在没有任何 IO 的情况下从静态列表中获取数据。
最好的方法是使用函数 selectField
。你应该看看它的类型:
selectField ::(Eq a, RenderMessage site FormMessage) =>
HandlerT site IO (OptionList a) -> Field (HandlerT site IO) a
即你可以使用类似的东西
selectList (fmap convertYourListToOptionList findAllAsTuple)
我终于找到了解决办法。
我的函数应该如下所示:
findAllAsTuple :: HandlerT App IO (OptionList Text)
findAllAsTuple =do
items <- runDB $ selectList [] [Asc CategoryName]
optionsPairs $ map (\c -> (categoryName $ entityVal c,categoryName $ entityVal c)) items
Dmitry 是对的,我应该使用 selectField 而不是 selectFieldList。
optionsPairs
将从结果创建 OptionList。
这个问题被重复了:Capturing Persistent Relations in a Form
我想在我的表单中添加一个 selectionFieldList,但不幸的是我无法填充数据库中的值,因为我遇到了编译错误。
我有这样的表单定义:
flowerForm = renderDivs $ FormFlower
<$> areq textField "Flower" Nothing
<*> areq (selectFieldList findAllAsTuple) "Category" Nothing
和 findAllAsTuple 函数:
findAllAsTuple ::[(Text,Text)]
findAllAsTuple = fmap (map (\cat -> (categoryName $ entityVal cat, categoryName $ entityVal cat))) $ runDB $ selectList [] [Asc CategoryName]
但是我得到了这个错误:
Handler\Category.hs:6:18:
Couldn't match type `HandlerT site0 IO' with `[]'
Expected type: [(Text, Text)]
Actual type: HandlerT site0 IO [(Text, Text)]
In the expression:
fmap
(map
(\ cat
-> (categoryName $ entityVal cat, categoryName $ entityVal cat)))
$ runDB $ selectList [] [Asc CategoryName]
In an equation for `findAllAsTuple':
findAllAsTuple
= fmap
(map
(\ cat
-> (categoryName $ entityVal cat, categoryName $ entityVal cat)))
$ runDB $ selectList [] [Asc CategoryName]
如果我删除 fmap,我会收到此错误:
Handler\Category.hs:6:95:
Couldn't match expected type `[Entity Category]'
with actual type `HandlerT site0 IO [Entity Category]'
In the second argument of `($)', namely
`runDB $ selectList [] [Asc CategoryName]'
In the expression:
map
(\ cat
-> (categoryName $ entityVal cat, categoryName $ entityVal cat))
$ runDB $ selectList [] [Asc CategoryName]
In an equation for `findAllAsTuple':
findAllAsTuple
= map
(\ cat
-> (categoryName $ entityVal cat, categoryName $ entityVal cat))
$ runDB $ selectList [] [Asc CategoryName]
我也试过这个方法:
findAllAsTuple ::[(Text,Text)]
findAllAsTuple = do
items <- runDB $ selectList [] [Asc CategoryName]
return $ map (\cat -> (categoryName $ entityVal cat, categoryName $ entityVal cat)) items
但我后来得到了这个:
Handler\Category.hs:8:17:
Couldn't match type `[(Text, Text)]' with `(Text, Text)'
Expected type: [(Text, Text)]
Actual type: [[(Text, Text)]]
In a stmt of a 'do' block:
return
$ map
(\ cat
-> (categoryName $ entityVal cat, categoryName $ entityVal cat))
items
In the expression:
do { items <- runDB $ selectList [] [Asc CategoryName];
return
$ map
(\ cat
-> (categoryName $ entityVal cat, categoryName $ entityVal cat))
items }
In an equation for `findAllAsTuple':
findAllAsTuple
= do { items <- runDB $ selectList [] [Asc CategoryName];
return
$ map
(\ cat
-> (categoryName $ entityVal cat, categoryName $ entityVal cat))
items }
我不明白为什么。如果我像这样编写一个简单的地图函数:
findAllAsTuple ::[(Text,Text)]
findAllAsTuple = map (\cat -> (cat,cat)) ["red","blue","yellow"]
它运行良好,我没有收到任何类型错误。
findAllAsTuple
的类型是 HandlerT site IO [(Text, Text)]
。
您可以通过删除(错误的)类型签名在 GHCI 中检查它。
函数 selectFieldList
应该在没有任何 IO 的情况下从静态列表中获取数据。
最好的方法是使用函数 selectField
。你应该看看它的类型:
selectField ::(Eq a, RenderMessage site FormMessage) =>
HandlerT site IO (OptionList a) -> Field (HandlerT site IO) a
即你可以使用类似的东西
selectList (fmap convertYourListToOptionList findAllAsTuple)
我终于找到了解决办法。
我的函数应该如下所示:
findAllAsTuple :: HandlerT App IO (OptionList Text)
findAllAsTuple =do
items <- runDB $ selectList [] [Asc CategoryName]
optionsPairs $ map (\c -> (categoryName $ entityVal c,categoryName $ entityVal c)) items
Dmitry 是对的,我应该使用 selectField 而不是 selectFieldList。
optionsPairs
将从结果创建 OptionList。
这个问题被重复了:Capturing Persistent Relations in a Form