Я пытаюсь извлечь значение из монады, но сохраняю значение, которое не зависит от монады, полиморфное. В частности:
foo :: (Monad mon, Ring a) => mon a
foo = return 3
main :: IO ()
main = do
x <- foo
print (x :: Double)
print (x :: Int)
Дело в том, что монадическая часть вычисления является дорогостоящей для вычисления, поэтому я хочу сделать это только один раз, сохраняя значение в полифонии монады. Все мои попытки до сих пор:
- давая
x
подписьforall a. (Ring a) => a
) - предоставление
foo :: (Monad mon) => mon (forall a . (Ring a) => a)
- включение
-XNoMonomorphismRestriction
иNoMonoLocalBins
либо не работали, либо давали ошибки об импрессивном полиморфизме, которые я не желаю использовать. Есть ли какой-то способ вывести полиморфное значение из монады без импертивирующего полиморфизма (или, альтернативно: существует ли безопасный способ использования недифференцирующего полиморфизма в GHC)?