Haskell:将计算结果写入文件

时间:2010-06-17 04:14:13

标签: haskell io

我有一个在计算后创建元组的函数,但我想将它写入文件。

我知道如何使用writeFile写入文件,但不知道如何在类型签名中将计算和monads IO组合在一起。

这是我的代码。

invest :: ([Char]->Int->Int->([Char], Int) ) 
 -> [Char]->Int->Int->([Char], Int)
invest myinvest x y = myinvest x y

myinvest :: [Char]->Int->Int->([Char], Int)
myinvest w x y 
 | y > 0 = (w, x + y)
 | otherwise = error "Invest amount must greater than zero"
 where 

我有一个从列表中计算最大值的函数,但是我想让这个函数从文件接收输入,然后执行最大值的计算。

maximuminvest :: (Ord a) => [a] -> a
maximuminvest [] = error "Empty Invest Amount List"
maximuminvest [x] = x

maximuminvest (x:xs)   
     | x > maxTail = x  
     | otherwise = maxTail  
     where maxTail = maximuminvest xs

请帮忙。 谢谢。

[编辑]

  1. 我的新问题如下。
  2. 第一个和第二个问题可以通过函数组合来解决,但是当我尝试它时说类型不匹配。

    我已经检查过,但我找不到任何错误。

    invest :: ( [Char]->Int->Int->([Char], Int) ) -> [Char]->Int->Int-> ([Char], Int)
    invest theinvest x y = theinvest x y
    
    theinvest :: [Char]->Int->Int-> ([Char], Int)
    theinvest w x y | y > 0 = (w, x + y)
                    | otherwise = error "Invest amount must greater than zero"
    
    savefile :: ([Char], Int) -> IO()
    savefile (x, y) = do
      let name = fst (x, y)
      let temp = snd(x, y)
      let amount = show temp
    
      writeFile "C:\\Invest.txt" (name ++ " " ++ amount)
    
    test = savefile . theinvest "asd" 1234 234
    

    错误消息是

     ERROR - Type error in application
     * Expression : savefile . invest theinvest "234" 234 234 
             Term : invest theinvest "234" 234 234 
             Type : ([Char],Int)
     * Does not match : a -> b
    

    请帮忙。我的返回类型是([Char],Int)。为什么投诉为a -> b?感谢

    我使用像savefile这样的命令来解决这个问题(投资theinvest“asd”12 12),但是为什么运营商不能这样做?

    1. 我的第四个问题是我有类似这样的东西[“peter”,“1000”,“michell”,“2000”,“kelly”,“3000”]我想转换为[(“ peter“,1000),(”michell“,2000),(”kelly“,3000)]

    2. 文件内容的读取没问题,但我想过滤字符串并仅获取数字。例如,具有“peter 100 \ nasd 200”

    3. 的文件

      我想删掉字母表并在此处保留整数。 我只想让[100,200]成为函数的参数。

      请帮忙。

      感谢。

4 个答案:

答案 0 :(得分:7)

您可能想要执行类似

的操作
main = do
  c <- computation
  writeFile "filename" (show c)

使用Show实例写出计算结果的文件。如果您的类型足够简单,那么Haskell再次恢复该值是人类可读和可读的。

对于第二个问题,假设您的文件将值存储为

[1.5,2.3,5.1,6.3,9.8]

然后很容易阅读它们并执行计算:

main = do
  str <- readFile "filename"
  return $ computation (read str)

应该这样做。相反,如果您的数据包含每行项目,或CSV文件或其他内容,则会涉及更多内容。对于CSV,Hackage上的Text.CSV似乎可以解决问题。

答案 1 :(得分:3)

关于关于函数组合的问题,你必须记住函数应用程序的绑定非常强烈 - 比组合更强烈。所以你有问题的表达式解析为

savefile . (theinvest "asd" 1234 234)

(theinvest "asd" 1234 234)的类型是([Char],Int),它不是一个功能,不能编写。这就是类型错误的含义。

您希望将savefile应用于此,最简单的方法是删除.并将括号括起来。另一种方法是将.替换为$这是一个弱绑定函数应用程序运算符。如果你真的,真的想要一段时间,你可以使用(savefile . theinvest "asd" 1234) 234,但在我看来,这非常愚蠢和不清楚。

答案 2 :(得分:2)

  

在计算后创建一个元组,但我想将其写入文件。

最简单的方法是使用'show',它为大多数Haskell数据类型提供了基于文本的序列化方法。

writeFile "foo" (show c)

为了更有效的序列化,有Data.Binary

encodeFile "foo" c

将以二进制格式编写。

答案 3 :(得分:1)

对于你的上一个问题,你会使用行来获取[“peter 2000”,Joe“50”]等,然后使用过滤器来删除非数字。 所以

filter Data.Char.isDigit . lines

应该这样做(注意:未经测试编写的代码可能不是100%,并且它不能正确处理“7Bill 400”的情况。)