Если программист не ожидает, что [некоторый ввод] может заставить [program] потреблять больше, чем доступные ресурсы, это уязвимость в виде возможного DoS. Это слабость всех языков, полных тьюринга, которые я видел, но лень Хаскелла затрудняет рассуждения о том, что включает в себя вычисление.
В качестве (довольно надуманного) примера,
import Control.Monad (when)
import System (getArgs)
main = do
files <- getArgs
contents <- mapM readFile files
flip mapM_ (zip files contents) $ \(file, content) ->
when (null content) $ putStrLn $ file ++ " is empty"
Наивный программист может подумать: «Haskell ленив, поэтому он не будет открывать и читать файлы, пока в этом нет необходимости», и «Haskell собирает мусор, поэтому, как только он будет сделан с файлом, он может закрыть файл справиться". К сожалению, эта программа на самом деле просто откроет сразу много файлов (зависящих от реализации), и только пустые файлы закроют свои файловые дескрипторы (побочный эффект правил реализации реализации):
$ ghc --make -O2 Test
[1 of 1] Compiling Main ( Test.hs, Test.o )
Linking Test ...
$ strace -etrace=open,close ./Test dir/* /dev/null
...
open("dir/1", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 3
open("dir/2", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 4
open("dir/3", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 5
open("dir/4", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 6
open("dir/5", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 7
...
open("/dev/null", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 255
close(255)
/dev/null is empty
$
Возможно, вы не ожидали ошибки -EMFILE "Too many open files".
Как я уже сказал, это надуманный пример, который может встречаться и на других языках, но в Haskell проще пропустить использование некоторых ресурсов.