Haskell 如何在IHP脚本中重用IHP类?
使用IHP(haskell web框架),我创建了一个web应用程序。现在我想创建一个IHP脚本,将一些外部数据加载到我的数据库中。然而,我从《序曲》中得到了很多导入冲突,但不是我所期望的类型Haskell 如何在IHP脚本中重用IHP类?,haskell,ihp,Haskell,Ihp,使用IHP(haskell web框架),我创建了一个web应用程序。现在我想创建一个IHP脚本,将一些外部数据加载到我的数据库中。然而,我从《序曲》中得到了很多导入冲突,但不是我所期望的类型 #/usr/bin/env运行脚本 模块Application.Script.DataLoader,其中 导入Application.Script.Prelude隐藏(解码、打包,(.:)) 将限定数据.ByteString.Lazy导入为BL 导入数据.Csv 导入数据。文本(包) 导入符合条件的数据。
#/usr/bin/env运行脚本
模块Application.Script.DataLoader,其中
导入Application.Script.Prelude隐藏(解码、打包,(.:))
将限定数据.ByteString.Lazy导入为BL
导入数据.Csv
导入数据。文本(包)
导入符合条件的数据。向量为V
进口管制.单子(mzero)
实例FromNamedRecord产品,其中
parseNamedRecord r=产品定义r.:“标题”r.:“价格”r.:“类别”纯定义
运行::脚本
跑=做
csvData putStrLn$pack错误
右(v,v)->v.forM v$\p->
putStrLn$(获取标题p)++”,“++显示(获取价格p)++欧元”
其中,我的产品
架构如下所示:
创建表格产品(
id UUID默认UUID_generate_v4()主键不为空,
标题文本不为空,
价格双精度不为空,
类别文本不为空
);
是否有方法将我创建的类型用作数据对象,例如将我的csv读取到
[更新输出]
Application/Script/DataLoader.hs:12:26: error:
• Couldn't match type ‘MetaBag -> Product' a1’
with ‘Product' (QueryBuilder ProjectProduct)’
Expected type: Parser Product
Actual type: Parser (MetaBag -> Product' a1)
• In the expression:
Product def <$> r .: "title" <*> r .: "price" <*> r .: "category"
<*> pure def
In an equation for ‘parseNamedRecord’:
parseNamedRecord r
= Product def <$> r .: "title" <*> r .: "price" <*> r .: "category"
<*> pure def
In the instance declaration for ‘FromNamedRecord Product’
|
12 | parseNamedRecord r = Product def <$> r .: "title" <*> r .: "price" <*> r .: "category" <*> pure def
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Application/Script/DataLoader.hs:12:26:错误:
•无法匹配类型“MetaBag->产品“a1”
使用“产品”(QueryBuilder ProjectProduct)
预期类型:解析器产品
实际类型:解析器(MetaBag->Product'a1)
•在表达式中:
产品定义r.:“标题”r.:“价格”r.:“类别”
纯def
在“parseNamedRecord”的方程式中:
语法分析器
=产品定义r.:“标题”r.:“价格”r.:“类别”
纯def
在“FromNamedRecord产品”的实例声明中
|
12 | parseNamedRecord r=产品定义r.:“标题”r.:“价格”r.:“类别”纯定义
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[已解决,全部归功于@mpscholten的帮助]
#/usr/bin/env运行脚本
模块Application.Script.DataLoader,其中
导入Application.Script.Prelude隐藏(解码、打包,(.:))
将限定数据.ByteString.Lazy导入为BL
导入数据.Csv
导入数据。文本(包)
导入符合条件的数据。向量为V
进口管制.单子(mzero)
parseProduct::NamedRecord->ParserProduct
parser=do
标题集#类别
|>纯洁的
运行::脚本
跑=做
csvData putStrLn$pack错误
右(v,v)->v.forM v$\p->
putStrLn$(获取标题p)++”,“++显示(获取价格p)++欧元”
你能分享一下你到底遇到了什么错误吗?您所需的产品类型应该在生成的.Types
中,哪个intern由应用程序.Script.Prelude
加载
我想你可能有两个模型,都有领域的标题。在haskell中,字段是函数,不能使用两次。在
FromNamedRecord
实例中,缺少两个字段:id
和meta
。id
字段是记录的第一个字段。meta
字段是IHP用来跟踪验证错误的隐藏字段。它总是记录的最后一个字段
解决此问题的最简单方法是使用newRecord
并以更明确的方式写出代码:
实例FromNamedRecord产品,其中
parseNamedRecord r=do
标题集#类别
|>纯洁的
对于错误“不明确的事件‘标题’”,请尝试使用
get
函数,而不是使用普通的haskell访问器函数:
putStrLn$(获取标题p)++”,“++显示(获取价格p)++欧元”
也会问同样的问题。GHC输出是什么?:)感谢您的回复,我添加了输出,这似乎是一个改进,但这不是haskell,如果它立即修复的话。。我更新了编译器输出。我在这里遗漏了什么?更新了答案:)这解决了问题(用我的措辞)谢谢!对于每个对木薯工作示例感兴趣的人,请参见更新的问题。