【问题标题】:What's "ambiguous" here and how do I fix it?什么是“模棱两可”,我该如何解决?
【发布时间】:2012-12-16 15:07:25
【问题描述】:

有人告诉我编写一个函数来检查字符串中的标点符号是否都是空格。即:

haskell> f "Hello my name is Brad"
True

haskell> f "Hello my name is Brad!"
False

我写了一个辅助函数如下,

import Data.Char
isPunc x = not (isDigit x || isAlpha x)

这被 Haskell 接受并且运行良好。但是一旦我在下面的函数中使用它,

--function f defined
f :: String -> Bool
f xs = and [ x == ' ' | x <- xs, isPunc x]

它给了我这个错误:

ambiguous occurence 'isPunc', could mean "Main.isPunc" or "Data.Char. isPunc"

我得到了它抱怨的部分内容,但是导入了 Data.Char,我真的不明白它为什么抱怨。

【问题讨论】:

  • @minitech 有吗?在我的安装中没有具有该名称的功能,并且它也没有在文档中列出(尽管isPunctuation 是)。请注意,OP 的代码对我来说很好。
  • 布拉德,您是否按原样发布了代码和错误消息?你没有在你的真实代码中将你的函数命名为isPunctuation,然后在代码和错误消息中将它重命名为isPunc,是吗?

标签: haskell import variable-names


【解决方案1】:

(这篇文章是在假设您真正将您的函数命名为isPunctuation,而不是isPunc)的情况下编写的)

这是模棱两可的,因为当您调用 isPunctuation 时,Haskell 不知道您是指自己的 isPunctuation 函数 (Main.isPunctuation) 还是 Data.CharisPunctuation 函数。这是模棱两可的因为您导入了Data.Char - 如果您没有导入它或者如果您导入它是合格的,那么isPunctuation 只能引用Main.isPunctuation 不会有歧义。

要解决歧义,要么不要从Data.Char 导入isPunctuation(通过将导入行更改为import Data.Char hiding (isPunctuation)),导入Data.Char 合格(因此您必须将其函数称为Data.Char.functionName而不仅仅是functionName),或者给你的函数一个不与Data.Char中的任何内容冲突的不同名称。

【讨论】:

    【解决方案2】:

    Data.Char 模块有一个名为isPunctuation 的函数。你得到你提到的错误的唯一方法是如果你已经命名了你正在创建的函数。你在这里给的名字是isPunc,应该没问题,但我想你实际上用了isPunctuation. 使用不同的名字或者使用限定导入:

    import qualified Data.Char as Char
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      相关资源
      最近更新 更多