在创建模块时在Haskell中命名冲突

时间:2015-07-08 17:05:15

标签: haskell module namespaces

在以下代码中,我必须使用elem'而不是elem,因为prelude已经有一个函数elem,在声明Tree模块时如何使用elem ,避免冲突??

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

1 个答案:

答案 0 :(得分:3)

默认情况下,Prelude模块在​​范围内,但可以覆盖此模块。 明确导入Prelude的任何模块在开始时都有隐式import Prelude;但是,如果您显式导入Prelude,则不会添加。因此,您可以使用Prelude

导入elemhiding以外的import Prelude hiding (elem)
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

在代码的上下文中,这是

Prelude.elem

如果您仍然需要参考import qualified Prelude,您也可以随时添加额外的Prelude行。

有关模块导入的更多信息,请参阅the Haskell Wiki's nice summary of import,包括有关如何导入模块的各种选项以及有关(隐藏)隐式Prelude导入的一些选项。

(当然,虽然您通常不太需要它,但模块的最终仲裁者是the Haskell 2010 report, Ch. 5; §5.3是导入语法,§5.5是名称冲突,并且 public class LoginActivity extends Activity { Button btnLogin; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ............ } //inner class class OnClickListenerLogin implements OnClickListener { ......... } }//Login class ends 位于.distinct(包括§5.6,“影影前奏名称”)。