我被告知编写一个函数来检查字符串中的标点符号是否都是空格。即:
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,我真的不明白它为什么抱怨。
答案 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