我可以在不使用'main'函数的情况下,在 Haskell 中使用单独的函数来读取和写入 txt 文件吗?



我正在使用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

当然,想要保存或加载有点奇怪,大多数可以做这些事情的程序都想做这两件事,但我不知道你到底要做什么,所以我保持了它的通用性。

相关内容

  • 没有找到相关文章

最新更新