Предположим, у вас есть модуль, который, как вы знаете, безопасен.Как включить Safe Haskell для модуля с обратной совместимостью
Вы хотите отметить его как безопасный Haskell с чем-то вроде {-# LANGUAGE Safe #-}
в самом модуле или с чем-то вроде Extensions: Safe
в файле cabal. К сожалению, при выполнении любой из этих функций происходит возврат назад совместимости (т. Е. Модуль не будет построен на GHC < 7.2).
Если вся библиотека является безопасной, вы можете просто обернуть директиву расширений в Кабал файл, как это:
if impl(ghc >= 7.2)
Extensions: Safe
Но это работает только для всей библиотеки.
Как вы отмечаете один модуль как безопасный Haskell в обратном совместимом режиме?
'{- # LANGUAGE CPP # -} ; #if __GLASGOW_HASKELL__> = 702; {- # LANGUAGE Safe # -}; # endif'? –
... и я как раз собирался ответить на этот точный фрагмент кода. @DanielFischer прав; он работает, но он не работал бы над версиями более ранних версий GRC, потому что все прагмы «LANGUAGE» должны были быть в одном блоке тогда (так что «CPP» не был бы включен «вовремя» для следующей строки) , Вы также можете определить флаг Cabal, который обнаруживает версию GHC и условно использует совершенно другой файл при компиляции. – dflemstr
@ DanielFischer Это именно то, что я искал. Спасибо. Я приму это как ответ, если вы опубликуете его. – scvalex