我正在使用Haskell制作一个程序,它需要简单的保存和加载功能。当我调用保存函数时,我需要将一个字符串放入文本文件中。当我调用 load 时,我需要从文本文件中提取字符串。
我知道哈斯克尔中围绕IO的复杂性。通过网上的一些阅读,我发现通过"main"功能是可能的。但是,我似乎只能实现保存或加载...不能两者兼而有之。
例如,我目前有以下函数用于从文件中读取。
main = do
contents <- readFile "Test.txt"
putStrLn contents
如何实现写入函数?它必须在同一功能中吗?或者我可以分开吗?另外,有没有办法让我能够命名函数加载/保存?当我实际上想调用"加载"或"保存"时,不得不调用"main"是相当烦人的。
我在网上找不到任何实现两者的人的例子,而且我发现的任何实现总是通过一个主函数。
任何建议将不胜感激。
我知道Haskell中IO的复杂性。
实际上并没有那么复杂。乍一看似乎有点吓人,但您很快就会掌握它的窍门。
如何实现写入函数?
同样的方式
或者我可以分开吗?
是的
另外,有没有办法让我能够命名函数加载/保存?
是的,例如,您可以像这样进行加载:
load :: IO String
load = readFile "Test.txt"
所有Haskell程序都从main开始,但它们不必停留在那里,所以你可以像这样使用它:
main :: IO ()
main = do
contents <- load -- notice we're using the thing we just defined above
putStrLn contents
请注意,main
始终是程序的作用;但是您的main
不仅要做一件事。它也可以做很多事情,包括例如读取一个值,然后决定做什么;这是一个更复杂(完整)的例子 - 我希望你不会立即理解它的所有部分,但它至少应该给你一些可以玩的东西:
data Choice = Save | Load
pickSaveOrLoad :: IO Choice
pickSaveOrLoad = do
putStr "Do you want to save or load? "
answer <- getLine
case answer of
"save" -> return Save
"load" -> return Load
_ -> do
putStrLn "Invalid choice (must pick 'save' or 'load')"
pickSaveOrLoad
save :: IO ()
save = do
putStrLn "You picked save"
putStrLn "<put your saving stuff here>"
load :: IO ()
load = do
putStrLn "You picked load"
putStrLn "<put your loading stuff here>"
main :: IO ()
main = do
choice <- pickSaveOrLoad
case choice of
Save -> save
Load -> load
当然,想要保存或加载有点奇怪,大多数可以做这些事情的程序都想做这两件事,但我不知道你到底要做什么,所以我保持了它的通用性。