Вопрос по haskell – Конфликты пакетов GHC

7

Я пытаюсь скомпилировать следующий код с помощью GHC:

<code>module Test where

import Maybe
import Prelude hiding (null)
import System.IO

null = ()

main :: IO ()
main = putStrLn "Hello, world!"
</code>

Если я просто бегуghc Test.hs, Я получил:

<code>Could not find module `Maybe'
It is a member of the hidden package `haskell98-2.0.0.1'.
</code>

Так я стараюсьghc -package haskell98 Test.hs:

<code>Ambiguous module name `Prelude':
  it was found in multiple packages: base haskell98-2.0.0.1
</code>

Это не кажется правильным, но я пытаюсьghc -package haskell98 -hide-package base Test.hs:

<code>Could not find module `System.IO'
It is a member of the hidden package `base'.
It is a member of the hidden package `haskell2010-1.1.0.1'.
</code>

Итак, я пытаюсьghc -package haskell98 -hide-package base -package haskell2010 Test.hs:

<code>Ambiguous module name `Prelude':
  it was found in multiple packages:
  haskell2010-1.1.0.1 haskell98-2.0.0.1
</code>

Как мне скомпилировать этот код? Я использую GHC 7.4.1.

Ваш Ответ

2   ответа
13

Data.Maybe.haskell98 package больше не совместим сbase, поэтому с помощьюhaskell98 модули приносит просто ненужную боль.

Я думал, что Maybe и Data.Maybe - это разные модули. Они эквивалентны? Adam Crume
@ AdamCrume: Data.Maybe в значительной степени надмножество старогоМожет быт модуль. Если вы сравните документы, вы увидите, что основным отличием является то, что Data.Maybe экспортирует больше экземпляров. hammar
Mabye это просто оболочка haskell98 вокругData.Maybe. Они эквивалентны почти во всех отношениях, кроме использованияMaybe требует от вас прыгать через несколько обручей, поскольку вы не можете использовать его вместе с базой. Daniel Fischer
12

haskell98, base, илиhaskell2010.haskell*акеты @ - это набор библиотек, которым соответствует соответствующий языковой стандарт, поэтому, если вы используете одну из них, у вас больше шансов быть совместимыми с компиляторами не-GHC. Тем не менее, подавляющее большинство пакетов на Hackage используютbase в любом случае, так что, наверное, тебе лучше придерживаться этого.

Haskell98, строго говоря, предшествует иерархическим модулям, поэтому все они называютсяMaybe а такжеList а такжеIO и так далее. (На самом деле, я думаю, что это лучшие имена, чем они сейчас, но это другая история). Ваша проблема в том, что вы пытались использовать старыйMaybe и новыйSystem.IO в то же время, и ни старый, ни новый пакет не предоставляют оба варианта.

Очень информативно. Спасибо Adam Crume

Похожие вопросы