Могу ли я иметь отдельные функции для чтения и записи в текстовый файл в Haskell без использования «основной» функции?

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

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

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

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

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

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

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


person SuperHanz98    schedule 24.04.2019    source источник
comment
Это не функция; это действие IO.   -  person chepner    schedule 24.04.2019
comment
@chepner Конечно, но я не думаю, что это действительно полезная точка зрения для тех, кто еще не знает, что это значит, и вообще изо всех сил пытается выполнять ввод-вывод.   -  person amalloy    schedule 24.04.2019
comment
Из некоторого чтения в Интернете я обнаружил, что это возможно с помощью «основной» функции. main — это точка входа вашей программы, как и функция public static void main() в Java. Это не единственное место, где вы можете выполнять ввод-вывод, вы можете создать столько функций ввода-вывода, сколько захотите, и назвать их как угодно. Просто, если эти функции будут использоваться, в конечном итоге их нужно будет вызывать (прямо или косвенно) с помощью main.   -  person DarthFennec    schedule 24.04.2019


Ответы (1)


Я знаю о сложностях, связанных с вводом-выводом в Haskell.

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

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

Так же

Или можно отделить?

Да

Кроме того, есть ли способ назвать функции загрузки/сохранения?

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

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

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

person Cubic    schedule 24.04.2019