Кратко отдавайте приоритет функциям, не относящимся к прелюдии, в ghci - PullRequest
2 голосов
/ 12 апреля 2019

У меня есть следующий импорт:

{-# LANGUAGE DeriveGeneric,  OverloadedStrings,  DefaultSignatures,  TypeOperators,  FlexibleContexts, RecordWildCards, FlexibleInstances, ExtendedDefaultRules #-}

import qualified Data.Map as Map
import qualified Data.Set as Set
import Data.Text
import GHC.Generics
import Data.DateTime
import Data.Aeson

Я пытаюсь использовать функцию lines для перехода на новую строку, и эта функция существует в Prelude и Data.Text, и я получаю следующее:

$ stack ghci
Prelude> :set -XOverloadedStrings
Prelude> :l mydat.hs
[1 of 1] Compiling Main             ( mydat.hs, interpreted )

mydat.hs:39:13: error:
    Ambiguous occurrence ‘lines’
    It could refer to either ‘Prelude.lines’,
                             imported from ‘Prelude’ at mydat.hs:1:1
                             (and originally defined in ‘base-4.11.1.0:Data.OldList’)
                          or ‘Data.Text.lines’,
                             imported from ‘Data.Text’ at mydat.hs:7:1-16
   |
39 |     print $ lines text
   |             ^^^^^
Failed, no modules loaded.

Из сообщения об ошибке видно, что это не удается, поскольку lines существует как в Prelude, так и в Data.Text.lines.

Я хотел бы сказать ghci взять / любую / импортированную функцию помимо Prelude over любая функция, определенная в Prelude, особенно с текстом.

Я думал, что один из способов сделать это - явно, выборочно скрыть Prelude.lines:

$ stack ghci
Prelude> :set -XOverloadedStrings -XNoImplicitPrelude
Prelude> import Prelude hiding (lines)
Prelude> :l mydat.hs
[1 of 1] Compiling Main             ( mydat.hs, interpreted )

mydat.hs:13:23: error:
    Not in scope: type constructor or class ‘Float’
    Perhaps you meant ‘UFloat’ (imported from GHC.Generics)

Но это не представляется возможным: если я пытаюсь просто скрыть одну функцию прелюдии, я теряю все остальные функции, которые мне действительно нужны.

Как правильно сохранить Data.Text функции и скрыть их от коллизий с Prelude.*? Я застрял между именами

import Data.Text as T

И используя, например:

T.lines 

?

Если это так, то это кажется немного громоздким и предполагает создание пакета Prelude, который, по сути, PreludeWithoutPreludeText загружает все остальное, кроме этого, - учитывая утилиту OverloadedStrings.

1 Ответ

1 голос
/ 12 апреля 2019

Это невозможно (если говорить о GHC 8.6.4).

Одна вещь, которую вы можете сделать, это квалифицировать Prelude вместо:

import qualified Prelude

опционально as P, что потребует от вас явного ввода Prelude. (или P.) перед любым именем из этой библиотеки.

Если вы часто используете другие функции Prelude, вы можете скрыть только совпадающие идентификаторы, написав

import Prelude hiding (lines)

, который удалит Prelude.lines из пространства имен.

Если вы все равно хотите использовать lines из Prelude где-нибудь в файле, вы можете импортировать этот конкретный идентификатор как квалифицированный:

import           Prelude hiding (lines)
import qualified Prelude as P (lines)

Боюсь, что это все, что вы можете сделать.

...