在ghci

时间:2019-04-11 21:39:14

标签: haskell text ghci haskell-prelude

我有以下进口商品:

{-# 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.

从错误消息中很明显,这是失败的,因为linesPrelude中都存在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程序包,以加载除此以外的所有其余程序。

1 个答案:

答案 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)

恐怕这是您可以做的所有事情。