首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在IHP脚本中重用IHP类?

如何在IHP脚本中重用IHP类?
EN

Stack Overflow用户
提问于 2020-10-25 15:32:43
回答 2查看 184关注 0票数 2

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

代码语言:javascript
复制
#!/usr/bin/env run-script
module Application.Script.DataLoader where

import Application.Script.Prelude      hiding (decode, pack, (.:))
import qualified Data.ByteString.Lazy  as     BL
import Data.Csv
import Data.Text                              (pack)
import qualified Data.Vector           as     V
import Control.Monad                          (mzero)

instance FromNamedRecord Product where
    parseNamedRecord r = Product def <$> r .: "title" <*> r .: "price" <*> r .: "category" <*> pure def

run :: Script
run = do
    csvData <- BL.readFile "~/tender/data/Boiler-en-kookkraan_Boiler.csv"
    case decodeByName csvData of
        Left err -> putStrLn $ pack err
        Right (_, v) -> V.forM_ v $ \ p ->
            putStrLn $ (get #title p) ++ ", " ++ show (get #price p) ++ " euro"

我的Product模式如下所示:

代码语言:javascript
复制
CREATE TABLE products (
    id UUID DEFAULT uuid_generate_v4() PRIMARY KEY NOT NULL,
    title TEXT NOT NULL,
    price DOUBLE PRECISION NOT NULL,
    category TEXT NOT NULL
);

是否有一种方法可以使用我创建的类型作为数据对象,例如读取我的csv?

更新输出

代码语言:javascript
复制
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
   |                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

解决了,所有的功劳都归功于@mpscholten的帮助

代码语言:javascript
复制
#!/usr/bin/env run-script
module Application.Script.DataLoader where

import Application.Script.Prelude      hiding (decode, pack, (.:))
import qualified Data.ByteString.Lazy  as     BL
import Data.Csv
import Data.Text                              (pack)
import qualified Data.Vector           as     V
import Control.Monad                          (mzero)

parseProduct :: NamedRecord -> Parser Product
parseProduct r = do
  title <- r .: "title"
  price <- r .: "price"
  category <- r .: "category"

  newRecord @Product
    |> set #title title
    |> set #price price
    |> set #category category
    |> pure

run :: Script
run = do
    csvData <- BL.readFile "data/Boiler-en-kookkraan_Boiler.csv"
    case decodeByNameWithP parseProduct defaultDecodeOptions csvData of
        Left err -> putStrLn $ pack err
        Right (_, v) -> V.forM_ v $ \ p ->
            putStrLn $ (get #title p) ++ ", " ++ show (get #price p) ++ " euro"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-26 17:33:37

FromNamedRecord实例中,您缺少两个字段:idmetaid字段是记录的第一个字段。meta字段是IHP用来跟踪验证错误的隐藏字段。这永远是记录的最后一个领域。

解决这一问题的最简单方法是使用newRecord并以更明确的方式写出代码:

代码语言:javascript
复制
instance FromNamedRecord Product where
    parseNamedRecord r = do
        title <- r .: "title"
        price <- r .: "price"
        category <- r .: "category"

        newRecord @Product
            |> set #title title
            |> set #price price
            |> set #category category
            |> pure

对于“歧义出现的‘标题’”错误,请尝试使用get函数而不是使用普通的haskell访问器函数:

代码语言:javascript
复制
putStrLn $ (get #title p) ++ ", " ++ show (get #price p) ++ " euro"
票数 3
EN

Stack Overflow用户

发布于 2020-10-25 17:38:55

你能分享一下你所犯的错误吗?您想要的产品类型应该在Generated.Types中,实习生是由Application.Script.Prelude加载的。

我想你可能有两种型号都有现场标题。在haskell中,字段是函数,不能使用两次。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64525488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档