0

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

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

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

main = do  
 contents <- readFile "Test.txt"  
 putStrLn contents  

我怎样才能实现写功能?它必须在同一个功能内吗?或者我可以分开吗?另外,有没有办法让我能够命名函数加载/保存?当我真正想调用“加载”或“保存”时不得不调用“主”是相当烦人的。

我在网上找不到任何实现这两者的人的例子,而且我发现的任何一个实现总是通过一个主函数。

任何建议将不胜感激。

4

1 回答 1

5

我知道 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

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

于 2019-04-24T16:11:29.597 回答