我可以在不使用“主要”功能的情况下拥有单独的用于读写Haskell中的txt文件的功能吗?

Cut*_*ter 0 io haskell program-entry-point do-notation io-monad

我正在使用Haskell编写程序,该程序需要简单的保存和加载功能。当我调用保存功能时,我需要将一个字符串放入文本文件中。调用load时,需要将字符串从文本文件中拉出。

我知道Haskell中围绕IO的复杂性。从网上的一些阅读中,我发现可以通过“主要”功能来实现。但是,我似乎只能实现保存或加载……不能同时实现。

例如,我目前具有以下功能,用于从文件读取。

main = do  
 contents <- readFile "Test.txt"  
 putStrLn contents  
Run Code Online (Sandbox Code Playgroud)

我还如何实现写功能?是否必须在同一功能内?还是可以分开?另外,有没有办法让我命名函数load / save?当我实际上想调用“加载”或“保存”时必须调用“ main”是很烦的。

我在网上找不到有人同时实现这两个功能的任何示例,而我发现的任何一个实现都总是通过主要功能执行。

任何建议将不胜感激。

Cub*_*bic 5

我知道Haskell中围绕IO的复杂性。

这其实不是那个复杂。乍一看似乎有些令人生畏,但您很快就会掌握它。

我还如何实现写功能?

以同样的方式

还是可以分开?

另外,有没有办法让我命名函数load / save?

是的,例如,您可以像这样进行加载:

load :: IO String
load = readFile "Test.txt"
Run Code Online (Sandbox Code Playgroud)

所有Haskell程序都在main内部启动,但不必停留在main内,因此您可以像这样使用它:

main :: IO ()
main = do
  contents <- load -- notice we're using the thing we just defined above
  putStrLn contents
Run Code Online (Sandbox Code Playgroud)

请注意,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
Run Code Online (Sandbox Code Playgroud)

当然,要保存或加载有点奇怪的,大多数能够执行这些操作的程序都希望同时执行这两种操作,但是我不知道您要做什么,所以我将其保留为通用名称。