【问题标题】:How do I write the qualified name of a symbol in Haskell?如何在 Haskell 中编写符号的限定名称?
【发布时间】:2009-04-12 02:19:09
【问题描述】:

我在两个想要使用相同中缀运算符 (<*>) 的不同 Haskell 模块之间发生了名称冲突。 Haskell 98 报告说

modid.varsym

是允许的,但我无法让它工作。这里的全部内容是Test.hs

module Test
where

import qualified Test2 as T

three = T.<*>

Test2.hs:

module Test2
where
(<*>) = 3

但尝试编译会导致错误消息:

Test.hs:6:12: parse error on input `T.<*>'

我试过T.(&lt;*&gt;),但也没用。

如何引用import qualified 导入的模块中定义的符号名称?

【问题讨论】:

    标签: haskell syntax identifier qualified-name


    【解决方案1】:

    试试

    three = (T.<*>)
    

    将中缀运算符定义为整数很奇怪。让我们考虑\\(集差运算符):

    import qualified Data.List as L
    
    foo = [1..5] L.\\ [1..3] -- evaluates to [4,5]
    diff = (L.\\)
    

    如上所示,L.\\ 是合格的中缀运算符;它仍然可以用作中缀运算符。要将其用作值,请在整个内容周围加上括号。

    【讨论】:

    • 确实很奇怪,但我试图使示例尽可能简单。
    【解决方案2】:

    请记住,我们导入符号包裹的括号。例如

    import T ((<*>))
    

    所以导入合格的也是一样的:

    import qualified T as Q
    
    main = print (Q.<*>)
    

    【讨论】:

    • 这是一个奇怪的解释......第一行与其余的并不真正相关。当然,第一行应该是“记住,未完全应用的运算符需要用括号括起来”。然后有 'f = ()' vs. 'f = (M.)'。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 2014-05-20
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    相关资源
    最近更新 更多