Обновление GHC 7.4 обновляется haskell98?
Я обновил ghc сегодня, и моя небольшая программа перестала работать:
https://github.com/BrisFunctional/misere-oxo/blob/master/OXO/misere.hs
GHC теперь является версией 7.4.1-2 и из того, что мне удалось понять, теперь по умолчанию
к стандарту haskell2010, вместо haskell98. (как я вижу из вывода списка ghc-pkg):
haskell2010-1.1.0.1
(haskell98-2.0.0.1)
Итак, я изменил свой "список импорта" на "import Data.List", который, как я думал, был единственной проблемой, но теперь я получаю следующее:
misere.hs:1:1: Not in scope: `System.Environment.withArgs'
откуда это происходит, поскольку я даже не импортирую System.Environment?
Любой намек?
Благодаря
EDIT:
Я обновил версию на github, чтобы отразить эту ошибку. и на самом деле использование Data.List ghc прекрасно компилирует файл, поэтому он запускает эту проблему..
Ответы
Ответ 1
Вам нужно не только изменить List
на Data.List
, но также Random
на System.Random
и импортировать getArgs
из System.Environment
(но на данный момент код не использует ни getArgs
, ни что-либо из System.Random
, поэтому пока вы также можете удалить их).
Старые неиерархические модули доступны только из пакета haskell98
, который больше не совместим с base
. Это означает, что использование модулей haskell98
также требует явно скрытия base
в командной строке или не перечисления base
в поле зависимостей файла .cabal
.
Я немного удивлен сообщением об ошибке, я ожидаю, что он скажет
Could not find module `System'
It is a member of the hidden package `haskell98-2.0.0.1'.
но эта разница может быть причудой runhaskell
.
Ответ 2
Если ваша программа чистая Haskell98, вы можете использовать следующую GHC-интрокацию:
ghc -package haskell98 -hide-package base
В долгосрочной перспективе было бы лучше, если бы вы обновили хотя бы иерархические имена модулей. Используйте Hoogle, чтобы узнать название модуля. Например, http://www.haskell.org/hoogle/?hoogle=withArgs
перечисляет System.Environment
в качестве экспортирующего модуля.
Ответ 3
Во-первых, я думаю, что вы используете System.Environment.withArgs из-за getArgs, который использует withArgs. Страница Hackage.Haskell для System.Environment
Попробуйте импортировать withArgs
и, возможно, целую System.Environment
.
Во-вторых, теперь может иметь место List
больше, чем Data.List
. Возможно, вы захотите включить весь Prelude
вместо Data.List
.
И чтобы ответить на вопрос в заголовке, каждое обновление GHC расширяет Haskell98. И некоторые языковые прагмы даже тормозят некоторые особенности Haskell98. Но в основном изменения в библиотеках вызывают проблемы, а не сами обновления GHC.
Надеюсь, я дал вам достаточно, чтобы решить проблемы.