我有一个在计算后创建元组的函数,但我想将它写入文件。
我知道如何使用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
请帮忙。 谢谢。
[编辑]
第一个和第二个问题可以通过函数组合来解决,但是当我尝试它时说类型不匹配。
我已经检查过,但我找不到任何错误。
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),但是为什么运营商不能这样做?
我的第四个问题是我有类似这样的东西[“peter”,“1000”,“michell”,“2000”,“kelly”,“3000”]我想转换为[(“ peter“,1000),(”michell“,2000),(”kelly“,3000)]
文件内容的读取没问题,但我想过滤字符串并仅获取数字。例如,具有“peter 100 \ nasd 200”
我想删掉字母表并在此处保留整数。 我只想让[100,200]成为函数的参数。
请帮忙。
感谢。
答案 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”的情况。)