Как работает monadicIO - PullRequest
       79

Как работает monadicIO

2 голосов
/ 05 марта 2020

У меня есть следующий код

fastShuffle :: [a] -> IO [a]
fastShuffle a = <some code>

prop_fastShuffle_correct :: [Int] -> Property
prop_fastShuffle_correct s =  
  monadicIO ( do
    sh <- run (fastShuffle s) 
    return ( True ==> ( insertionSort sh == insertionSort s  && 
                        if length s > 10 
                          then s /= sh 
                          else True ) ) )

И .. это работает. Я не могу понять, как то, что выглядит как чистая функция (prop_fastShuffle_correct), может вызывать не чистую функцию с побочными эффектами (fastShuffle).

Надеюсь, что кто-то может объяснить.

Спасибо!

1 Ответ

4 голосов
/ 05 марта 2020

Функции в Haskell никогда не имеют побочных эффектов.

Есть только значения с побочными эффектами, например getLine (это значение, а не функция). getLine - это инструкция "прочитать строку текста из стандартного в". Это не функция, которая выполняет инструкцию, она является инструкцией.

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

Нет проблем с хранением этих инструкций в чистых структурах данных. Однако если вы хотите выполнить их, то в какой-то момент они должны быть частью значения основной программы main.

...