4

我有以下进口:

{-# 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换行符,并且该函数同时存在于PreludeandData.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.

4

1 回答 1

3

这是不可能的(谈到 GHC 8.6.4)。

您可以做的一件事是获得资格Prelude

import qualified Prelude

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

如果您Prelude经常使用其他功能,您可以通过编写仅隐藏冲突标识符

import Prelude hiding (lines)

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

如果你想linesPrelude文件中的某个地方使用,你可以导入这个特定的标识符作为限定符:

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

恐怕这是你能做的一切。

于 2019-04-12T19:52:29.140 回答