Fth*_*der 2 haskell namespaces module
在下面的代码中,我不得不使用elem'而不是简单的elem,因为 prelude 已经有一个函数elem,我如何elem在声明 Tree 模块时使用,避免冲突??
module Tree(Tree(..), singleton, insert, elem') where
data Tree a = Empty | Node a (Tree a) (Tree a) deriving (Show)
singleton :: a -> Tree a
singleton a = Node a Empty Empty
insert :: (Ord a) => a -> Tree a -> Tree a
insert e Empty = singleton e
insert e tree@(Node e2 left right)
| e == e2 = tree
| e > e2 = Node e2 left (insert e right)
| e < e2 = Node e2 (insert e left) right
elem' :: (Ord a) => a -> Tree a -> Bool
e `elem'` Empty = False
e `elem'` (Node e2 left right)
| e == e2 = True
| e > e2 = e `elem'` right
| e < e2 = e `elem'` left
Run Code Online (Sandbox Code Playgroud)
虽然Prelude默认情况下模块在范围内,但这可以被覆盖。任何没有显式导入的模块在开始时Prelude都有一个隐含import Prelude的;但是,如果您显式导入 Prelude,则不会添加此内容。因此,您可以导入Prelude除了elem使用hiding:
import Prelude hiding (elem)
Run Code Online (Sandbox Code Playgroud)
在您的代码上下文中,这是
module Tree(Tree(..), singleton, insert, elem) where
import Prelude hiding (elem)
data Tree a = Empty | Node a (Tree a) (Tree a) deriving (Show)
-- ...
elem :: (Ord a) => a -> Tree a -> Bool
e `elem` Empty = False
e `elem` (Node e2 left right)
| e == e2 = True
| e > e2 = e `elem` right
| e < e2 = e `elem` left
Run Code Online (Sandbox Code Playgroud)
如果您仍然需要参考Prelude.elem,您也可以随时添加额外的import qualified Prelude行。
有关模块导入的更多信息import,请参阅Haskell Wiki 对 的精彩摘要,包括有关如何导入模块的各种选项以及有关(抑制)隐式Prelude导入的一些内容。
(当然,虽然您通常不太可能需要它,但模块的最终仲裁者是Haskell 2010 报告,第 5 章;第5.3 节是关于导入语法,第5.5 节是关于名称冲突,第5.6 节是关于Prelude(包括第5.6.2 节,“阴影序曲名称”)。