Как вы, возможно, уже знаете, Haskell - это «чистый» функциональный язык программирования.По этой причине побочные эффекты (например, печать значения на экране) не являются случайными, поскольку они встречаются в более распространенных языках.Этот факт дает Хаскеллу много хороших свойств, но вы были бы прощены за то, что не позаботились об этом, когда все, что вы делаете, - это пытаетесь распечатать значение на экране.
Поскольку у языка нет прямой возможности вызывать сторону-эффекты, стратегия заключается в том, что функции могут создавать одно или несколько значений "IO action".Действие ввода-вывода заключает в себе некоторый побочный эффект (печать на консоль, запись в файл и т. Д.) И, возможно, создание значения.Ваша dot
функция производит именно такое действие.Теперь у вас проблема в том, что вам нужно что-то, что может вызвать побочный эффект ввода-вывода, а также развернуть значение и, возможно, передать его обратно в вашу программу.
Без использования хаков это означает, чточто вам нужно, чтобы ваши действия ввода-вывода вернулись к функции main
.На практике это означает, что все, что находится между main
и dot
, должно быть в «IO Monad».То, что происходит в «IO Monad», остается, так сказать, в «IO Monad».
EDIT
Вот самый простой пример, который я мог бы представить для использования вашего *Функция 1015 * в допустимой программе на Haskell:
module Main where
main :: IO ()
main =
do
let xs = [2,3,4]
xr <- dot xs
xrr <- dot xr
return ()
dot (x:xs) =
do
print x
return xs