Ответ 1
В качестве примера можно привести следующие действия:
{-# LANGUAGE ImpredicativeTypes, RankNTypes #-}
import Data.Machine
f = (return :: (forall a. Process a a) -> IO (forall a. Process a a)) (auto id)
Как говорит Карл, вы должны аннотировать функции, которые вы хотите использовать нецелесообразно, например return
здесь. Даже тогда работа с нечистыми типами в GHC несколько хрупка. Я бы не рекомендовал его. Причинами ограничений являются просто то, что сложно выполнить вывод типа при наличии нечистоплотных типов, и, кроме того, язык поверхности Haskell не имеет надлежащего синтаксиса для указания типа, в котором вы хотите создать полиморфную функцию.
Общим решением является обернуть содержимое в newtype
:
data PolyProcess = PP (forall a. Process a a)
f' :: IO PolyProcess
f' = return $ PP $ auto $ id