Могу ли я иметь отдельные функции для чтения и записи в текстовый файл в Haskell, без использования «основной» функции? - PullRequest
0 голосов
/ 24 апреля 2019

Я делаю программу с использованием Haskell, которая требует простых функций сохранения и загрузки. Когда я вызываю функцию сохранения, мне нужно поместить строку в текстовый файл. Когда я вызываю load, мне нужно вытащить строку из текстового файла.

Я знаю о сложностях, связанных с IO в Haskell. Из некоторого чтения онлайн я обнаружил, что это возможно с помощью «основной» функции. Однако мне кажется, что я могу реализовать только сохранение или загрузку ... но не то и другое.

Например, в данный момент у меня есть следующая функция для чтения из файла.

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

Как я могу также реализовать функцию записи? Должно ли это быть в пределах одной и той же функции? Или я могу отделить это? Кроме того, есть ли у меня возможность назвать функции загрузки / сохранения? Необходимость вызывать 'main', когда я на самом деле хочу вызвать 'load' или 'save', довольно раздражает.

Я не могу найти в Интернете примеров того, как кто-то реализует оба, и любые найденные мной реализации всегда проходят через основную функцию.

Любой совет будет с благодарностью.

1 Ответ

5 голосов
/ 24 апреля 2019

Мне известны сложности, связанные с IO в Haskell.

Это на самом деле не , что комплекс. Поначалу это может показаться немного пугающим, но вы быстро освоитесь.

Как я могу также реализовать функцию записи?

Точно так же

Или я могу отделить его?

Да

Кроме того, есть ли у меня возможность назвать функции load / save?

Да, например, вы можете выполнить загрузку следующим образом:

load :: IO String
load = readFile "Test.txt"

Все программы на Haskell start внутри 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

Конечно, немного странно хотеть делать или сохранять или загружать, большинство программ, которые могут делать эти вещи, хотят и , но я не знаю, что именно Вы идете, поэтому я сохранил это общее.

...