假设我有
class Foo a where
(++=) :: a -> a -> a
cool :: (a -> b -> b) -> a -> b
Run Code Online (Sandbox Code Playgroud)
并想做
class Bar a where
(++=) :: (a -> b) -> a -> b
magic :: a -> b
Run Code Online (Sandbox Code Playgroud)
它有一个重叠的方法名称,(++=).有什么方法可以做到这一点吗?
这个问题有一个微妙的“不是,是”的答案,它需要进入三个概念:
第 1 点:Haskell 中的每个定义都有一个简短的非限定名称,例如map,和一个长的限定名称,例如Data.List.map。
第 2 点:当您将一个模块导入另一个模块时,您可以进行合格或不合格的导入。当您使用非限定导入时,您引入的外部模块的名称将以其短名称作为别名。当您进行限定导入时,它们将仅在修改后的名称下可用:
import qualified Data.Map as Map
Run Code Online (Sandbox Code Playgroud)
现在在出现它的模块中,该Data.Map.map函数在 alias 下可见Data.map。
第三点:这意味着每个 Haskell 定义都有一个完全限定名称,由其短名称和定义它的模块决定,但在导入它的每个模块中还有非限定或部分限定的别名。
现在,你的问题有两个答案:
Foo和Bar类,那将会失败。| 归档时间: |
|
| 查看次数: |
729 次 |
| 最近记录: |