我可以在 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

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