我可以在 Haskell 中使用单独的函数来读取和写入 txt 文件,而不使用 'main' 函数吗?
Can I have separate functions for reading and writing to a txt file in Haskell, without using a 'main' function?
我正在使用 Haskell 制作一个需要简单保存和加载功能的程序。当我调用保存函数时,我需要将一个字符串放入一个文本文件中。当我调用加载时,我需要将字符串从文本文件中拉出。
我知道 Haskell 中 IO 的复杂性。通过一些在线阅读,我发现可以通过 'main' 函数实现。但是,我似乎只能实现保存或加载...不能同时实现。
例如,我现在有以下读取文件的函数。
main = do
contents <- readFile "Test.txt"
putStrLn contents
如何实现写入功能?它必须在同一个函数中吗?或者我可以分开吗?另外,有没有办法让我能够命名函数 load/save?当我真正想调用 'load' 或 'save' 时必须调用 'main' 是相当烦人的。
我无法在网上找到任何实施这两者的示例,而且我发现的任何实施都始终通过主函数。
任何建议将不胜感激。
I'm aware of the complexities surrounding IO in Haskell.
实际上没有那么复杂。乍一看可能有点吓人,但您很快就会掌握窍门。
How can I also implement a write function?
同理
Or can I separate it?
是
Also, is there a way of me being able to name the functions load/save?
是的,例如您可以这样加载:
load :: IO String
load = readFile "Test.txt"
所有 Haskell 程序 start inside main,但它们不必 stay 在那里,所以你可以使用它像这样:
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
当然,想要要么保存要么加载有点奇怪,大多数可以做这些事情的程序都想做两者,但我不知道你到底要做什么,所以我保持通用。
我正在使用 Haskell 制作一个需要简单保存和加载功能的程序。当我调用保存函数时,我需要将一个字符串放入一个文本文件中。当我调用加载时,我需要将字符串从文本文件中拉出。
我知道 Haskell 中 IO 的复杂性。通过一些在线阅读,我发现可以通过 'main' 函数实现。但是,我似乎只能实现保存或加载...不能同时实现。
例如,我现在有以下读取文件的函数。
main = do
contents <- readFile "Test.txt"
putStrLn contents
如何实现写入功能?它必须在同一个函数中吗?或者我可以分开吗?另外,有没有办法让我能够命名函数 load/save?当我真正想调用 'load' 或 'save' 时必须调用 'main' 是相当烦人的。
我无法在网上找到任何实施这两者的示例,而且我发现的任何实施都始终通过主函数。
任何建议将不胜感激。
I'm aware of the complexities surrounding IO in Haskell.
实际上没有那么复杂。乍一看可能有点吓人,但您很快就会掌握窍门。
How can I also implement a write function?
同理
Or can I separate it?
是
Also, is there a way of me being able to name the functions load/save?
是的,例如您可以这样加载:
load :: IO String
load = readFile "Test.txt"
所有 Haskell 程序 start inside main,但它们不必 stay 在那里,所以你可以使用它像这样:
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
当然,想要要么保存要么加载有点奇怪,大多数可以做这些事情的程序都想做两者,但我不知道你到底要做什么,所以我保持通用。