我有以下进口商品:
{-# 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之外的/ 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
?
如果是这样,这似乎有点麻烦,并且建议使用OverloadedStrings
的实用工具制作一个本质上为PreludeWithoutPreludeText的Prelude程序包,以加载除此以外的所有其余程序。
答案 0 :(得分:1)
这是不可能的(谈论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)
恐怕这是您可以做的所有事情。