美文网首页Haskell
[Haskell] Name clashes

[Haskell] Name clashes

作者: 何幻 | 来源:发表于2016-12-27 15:43 被阅读10次

名字

一个模块名是一系列用点号分隔的标识符。这些标识符首字母都是大写,点号两边没有空格。
一个qualified name由模块名.unqualifed name构成。

例子

-- A.hs
module A where    -- 导出了A.f
  f = 1

-- B.hs
module B where    -- 导出了B.f
  f = 2

-- C.hs
module C(A.f) where    -- 导出了A.f
  import A    -- 导入了f, A.f
  import B    -- 导入了f, B.f
  f = 3

-- D.hs
module D(A.f, B.f) where    -- A.f与B.f的unqualifed name相同,但是引用的entity不同,报错
  import A    -- 导入了f, A.f
  import B    -- 导入了f, B.f
  f = 4

-- E.hs
module E(A.f,C.f) where    -- A.f与B.f的unqualifed name相同,引用的entity也相同,警告
  import A    -- 导入了f, A.f
  import C    -- 导入了f, C.f
  f = 5

-- F.hs
module F where    -- 导出了F.f
  import A as G    -- 导入了f, G.f
  import B as G    -- 导入了f, G.f
  f = 6

(1)模块C中,import Aimport B同时导入了f,但不会报错。
(2)模块C中,定义了自己的f不会报错,并且可以使用C.f来引用。
(3)在模块C中使用f的时候,会报错:Ambiguous occurrence ‘f’,因为f可能引用了模块A中的f,或模块B中的f,或模块C自己的f
(4)模块D使用(A.f, B.f),导出相同unqualifed name的不同entity,会报错:Conflicting exports for ‘f’
(5)模块E使用(A.f, C.f),导出相同unqualifed name的同一个entity,会警告:f’ is exported by ‘C.f’ and ‘A.f’
(6)模块F,将模块A中的f导入为G.f,将模块B中的f也导入为G.f不会报错,但是在使用G.f时会报错:Ambiguous occurrence ‘G.f’

总结

(1)导入时的名字冲突(不论是qualified name F.hs还是unqualified name C.hs),不会报错,但是使用这个有歧义的名字会报错。
(2)导出列表中的名字,去掉了模块名后得到unqualifed name,同名引用了不同的entity会报错(D.hs),同名引用了相同的entity会警告(E.hs)。
(3)模块中定义内部名字的时候,它是一个unqualifed name,但也会同时创建一个qualifed name(C.hs)。这个内部名字可能会与其他导入的unqualifed name冲突,但是不会报错,只会在引用这个unqualifed name的时候报错。

相关文章

  • [Haskell] Name clashes

    名字 一个模块名是一系列用点号分隔的标识符。这些标识符首字母都是大写,点号两边没有空格。一个qualified n...

  • Violence in American Literature

    Race and culture clashes can create violence and this tra...

  • Django Models 多个属性关联同一个外键

    (错误记录:(fields.E304) Reverse accessor for '' clashes with ...

  • 函数式的宗教-00: 认识lisp(clojure)与haske

    总体大纲: lisp与haskell简单介绍 lisp与haskell应用领域 lisp与haskell技术分析 ...

  • monad以及monad的四条定理

    haskell的范畴是hask范畴(haskell的所有类型隶属于hask范畴),所以haskell的所有函子都是...

  • 01 数据类型

    swift中结构体在haskell中的描述 枚举类型在haskell中的描述 枚举携带类型在haskell中描述 ...

  • Haskell学习-函数式编程初探

    原文地址:Haskell学习-函数式编程初探  为什么要学习函数式编程?为什么要学习Haskell?  .net到...

  • Haskell

    [TOC] Haskell GHCI 通过Tab可以自动补全 通过 :browser 模块名称,浏览该模块下的函数...

  • haskell

    我在这里只是表达此刻内心想到的一些事情,或者记录自己关于最近学习生活工作的想法。 从我这一周对haskell的学习...

  • [Haskell] $

    函数“$”称为function application operator,定义如下: 与函数调用不同的是,函数调用...

网友评论

    本文标题:[Haskell] Name clashes

    本文链接:https://www.haomeiwen.com/subject/awxevttx.html