如何将IO字符串转换为代数类型的数据"产品"一个txt文件?

时间:2017-03-28 23:20:20

标签: haskell io

我必须要求用户在Products.txt中输入产品的代码,名称和价格。

produtoPath::FilePath
produtoPath = "Products.txt"

 adicionaProd::IO()
 adicionaProd = do
    putStr "Product's Code:"
    cod<-getLine
    putStr "Product's Name:"
    nom<-getLine
    putStr "Product's Price:"
    pre<-getLine
--  appendFile produtoPath
    putStr "Do you want to add some other product?"
    resp <- getLine
    if ((resp == "y")) then adicionaProd else return()

所以,在添加产品之后,我必须创建另一个函数来读取Products.txt的内容,并返回Products ...类型Products = [(代码,名称,价格)],我这样做不知道怎么做... 我试过了,但我做不到。

 generateList:: [[String]]-> Produtos
 generateList [] = []
 --generateList [[cod,nom,pre]:[]] = [(read:cod)::]

之后,我必须使用loadProducts函数加载产品...它读取上一个函数的文件,并返回IO Products类型,以便用户可以以格式显示文件中的内容产品类型。

loadTable:: IO Produtos
loadTable = do
         s<-readFile produtoPath
    --   return generateList (map words)

总结:我不知道我应该如何将数据保存在&#34; addProd&#34;函数,读取文件并生成产品cpm的generateList函数,并使用loadTable函数将它们加载到用户。可以帮帮我吗? 我所做的完整代码:https://ideone.com/Al9ZLf

1 个答案:

答案 0 :(得分:1)

您可能需要从<{1}}返回输入数据。所以,它的类型必须成为

adicionaProd

然后,您调整代码本身

type Products   = [(Code, Name, Price)]
adicionaProd :: IO Products

这个想法是:如果响应是&#34;是&#34;,那么您递归地询问产品列表,并将其绑定到 adicionaProd = do putStr "Product's Code:" cod<-getLine putStr "Product's Name:" nom<-getLine putStr "Product's Price:" pre<-getLine let prod :: (Code, Name, Price) prod = (read cod, nom, read pre) putStr "Do you want to add some other product?" resp <- getLine if resp == "y" then do rest <- adicionaProd return (prod : rest) else return [prod] 。然后,您将返回包含您的产品的列表,然后返回其余部分。如果响应为&#34; no&#34;,则仅返回包含第一个产品的列表。