Haskell 如何在IHP脚本中重用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 导入数据。文本(包) 导入符合条件的数据。

使用IHP(haskell web框架),我创建了一个web应用程序。现在我想创建一个IHP脚本,将一些外部数据加载到我的数据库中。然而,我从《序曲》中得到了很多导入冲突,但不是我所期望的类型

#/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,如果它立即修复的话。。我更新了编译器输出。我在这里遗漏了什么?更新了答案:)这解决了问题(用我的措辞)谢谢!对于每个对木薯工作示例感兴趣的人,请参见更新的问题。