с линтипами мы можем например указать, что хендл можно использовать ровно один раз и только один раз
h1 <- openFile "a" -- получили хендл
close h1 -- хендл заиспользовали, больше его использовать нельзя
value <- hGetLine h1 -- невалидно
можно получить такой апи:
h1 <- openFile "a" -- получили h1, который нужно заиспользовать ровно один раз
(h2, value) <- hGetLine h1 -- h1 заиспользовали, получили h2, который тоже нужно заиспользовать раз
close h2 -- нельзя не закрыть, потому что h2 нужно заиспользовать ровно один раз
f :: FilePath -> IO String
f path = do
h <- openFile path
(h, value) <- hGetLine h
hClose h -- забыл написать - не тайпчекнулось
pure value