В некой программе на haskell я хочу сделать конфиг на haskell (для данной задачи это было бы гибко и удобно). Но грузить пользовательский код опасно, в других языках для этого нужно сооружать песочницы и т.д.
В чистом языке, казалось бы, ситуация другая: сигнатура пользовательской функции гарантирует, что она делает именно то, что просят. Рассмотрим такую ситуацию. Где-то в недрах моего кода:
use :: (Int -> Int -> Int) -> Int
use userFunc = userFunc 1 1
main = putStrLn $ show $ use f
Где f - пользовательская функция.
Но в пользовательском коде гипотетически возможно следующее:
import System.IO.Unsafe
import System.Process
f :: Int -> Int -> Int -- Safe looking signature
f a b = unsafePerformIO $ system "rm -rf /" >> return (a+b)
Можно ли предотвратить подобное как-то, кроме как ограничив подключение модулей? Конечно, в моём случае никто так делать не станет, просто задался вопросом.