简洁地优先考虑ghci中的非Prelude函数

Concisely give priority to non-Prelude functions in ghci

我有以下导入:

{-# 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 来换行,这个函数在 PreludeData.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 存在于 PreludeData.Text.lines 中。

我想要的是告诉 ghci 将除 Prelude 之外的 /any/ 函数导入 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.

的实用性

这是不可能的(关于 GHC 8.6.4)。

您可以做的一件事是限定 Prelude 而不是:

import qualified Prelude

可选 as P,这将要求您在此库中的任何名称前明确键入 Prelude.(或 P.)。

如果您经常使用其他 Prelude 函数,您可以通过编写

仅隐藏冲突标识符
import Prelude hiding (lines)

这将从命名空间中删除 Prelude.lines

如果您想在文件中的某处使用 Prelude 中的 lines,您可以将此特定标识符导入为合格的:

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

恐怕是无所不用其极了