-4

文字列の句読点がすべてスペースかどうかをチェックする関数を書くように言われました。すなわち:

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 をインポートしたので、不平を言っている理由がよくわかりません。

4

2 に答える 2

4

isPunctuation(この投稿は、関数に実際に名前を付けたのではなく、実際に名前を付けたという前提で書かれていますisPunc

Haskellは、を呼び出すときに自分のisPunctuation関数(Main.isPunctuation)を参照しているのか、の関数を参照しているのかを知らないため、あいまいです。インポートしたため、あいまいです。インポートしなかった場合、または修飾された状態でインポートした場合は、を参照するだけのようなあいまいさはありません。Data.CharisPunctuationisPunctuationData.CharisPunctuationMain.isPunctuation

isPunctuationあいまいさを修正するには、からインポートしないData.Char(インポート行をに変更するimport Data.Char hiding (isPunctuation))か、Data.Char修飾をインポートする(したがって、関数をData.Char.functionName単にではなくとして参照する必要がありfunctionNameます)か、関数に競合しない別の名前を付けます。から何でもData.Char

于 2012-12-16T15:17:46.537 に答える
0

Data.Charmodule には という名前の関数がありますisPunctuation。あなたが言及したエラーが発生する唯一の方法は、作成していた関数に同じ名前を付けた場合です。ここで指定した名前は です。これで問題ありませんが、実際には別の名前を使用するか、修飾されたインポートを使用したisPuncと思います。isPunctuation.

import qualified Data.Char as Char
于 2012-12-16T16:26:08.403 に答える