1

Haskell を試すのはこれが初めてなので、私の理解はかなり限られています。ファイルに単語が含まれているかどうかを確認するための非常に基本的なプログラムを作成したかったのですERROR。私はもちろんコンパイルさえしない次のことを思いつきました。

 import Text.Regex.Posix

 containsErrorString :: String -> Bool
 containsErrorString x = x =~ "ERROR" :: Bool

 fileContainsErrorString fileName = do
    s <- readFile fileName
    containsErrorString s

これは正しいアプローチですか?そうでない場合、これを達成する正しい方法は何ですか?

ありがとう

4

2 に答える 2

5

軽い書き直し

私は提案します:

  1. 「深刻な」作業Textの代わりに使用します。String
  2. 正規表現が必要ない場合は、正規表現を使用しないでください。

コード内:

import Data.Text as T

containsErrorString :: Text -> Bool
containsErrorString = ("ERROR" `T.isInfixOf`)

fileContainsErrorString :: FilePath -> IO Bool
fileContainsErrorString = containsErrorString `fmap` T.readFile

-- Warning, code typed and not tested.

あなたのコード

あなたのアプローチに問題はありません。の使用はString依然として一般的であり、ほとんどの用途で完全に受け入れられます。あなたのエラーはreturn、結果を忘れただけです(あなたはモナドにいてIO、 、containsErrorStringは純粋な関数です)。

それ以外の:

containsErrorString s

あなたが持っていたはずです:

return (containsErrorString s)
于 2013-09-19T01:17:39.773 に答える
1

主な問題は、実際には fileContainsErrorString :: IO Bool

しかしcontainsErrorString (s:: String) :: Bool

したがって、たとえば次のようにラップcontainsErrorStringする必要がありますIOreturn :: Monad m => a -> m a

fileContainsErrorString fileName = do
    s <- readFile fileName
    return $ containsErrorString s
于 2013-09-19T08:10:12.697 に答える