简洁地优先考虑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
来换行,这个函数在 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
?
如果是这样,那似乎有点麻烦,并且建议制作一个 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)
恐怕是无所不用其极了
我有以下导入:
{-# 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
?
如果是这样,那似乎有点麻烦,并且建议制作一个 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)
恐怕是无所不用其极了