这里有什么“含糊不清”,我该如何解决?

时间:2012-12-16 15:07:25

标签: haskell import variable-names

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

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,我真的不明白它为什么抱怨。

2 个答案:

答案 0 :(得分:4)

(这篇文章的编写假设您确实命名了您的函数isPunctuation,而不是isPunc

这是不明确的,因为Haskell在您致电{时不知道您是指您自己的isPunctuation函数(Main.isPunctuation)或Data.Char的{​​{1}}函数{1}}。这是不明确的,因为导入了isPunctuation - 如果你没有导入它或者你导入它是合格的,那么就不会有歧义,因为isPunctuation只能引用{{1} }}

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

答案 1 :(得分:0)

Data.Char模块有一个名为isPunctuation的函数。您提到错误的唯一方法是,如果您已命名您正在创建相同的功能。你在这里给出的名字是isPunc,这应该是完全正常的,但我认为你实际上使用了isPunctuation.使用不同的名字或使用合格的导入:

import qualified Data.Char as Char