基本的haskell程序,用于在文件中查找字符串

时间:2013-09-19 00:59:36

标签: haskell

这是我的第一次Haskell尝试,所以我的理解相当有限。我想编写一个非常基本的程序来检查文件是否包含单词ERROR。我想出了以下内容,当然甚至都没有编译。

 import Text.Regex.Posix

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

 fileContainsErrorString fileName = do
    s <- readFile fileName
    containsErrorString s

这是正确的方法,如果没有,那么正确的方法是什么?

由于

2 个答案:

答案 0 :(得分:5)

轻重写

我建议:

  1. 使用Text代替String代表任何&#34;严重的&#34;工作
  2. 如果您不需要正则表达式,请不要使用正则表达式。
  3. 在代码中:

    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结果(您是monad,IO,而containsErrorString是纯函数)。

    而不是:

    containsErrorString s
    
    你应该有:

    return (containsErrorString s)
    

答案 1 :(得分:1)

主要问题实际上是fileContainsErrorString :: IO Bool

但是containsErrorString (s:: String) :: Bool

所以,你需要将containsErrorString包裹到IO中,例如使用return :: Monad m => a -> m a

fileContainsErrorString fileName = do
    s <- readFile fileName
    return $ containsErrorString s