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”是很烦的。
我在网上找不到有人同时实现这两个功能的任何示例,而我发现的任何一个实现都总是通过主要功能执行。
任何建议将不胜感激。
我知道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)
当然,要保存或加载是有点奇怪的,大多数能够执行这些操作的程序都希望同时执行这两种操作,但是我不知道您要做什么,所以我将其保留为通用名称。
| 归档时间: |
|
| 查看次数: |
64 次 |
| 最近记录: |