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. 代替任何“严肃”的工作TextString
  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了结果(您在 monad 中IO,并且containsErrorString是纯函数)。

代替:

containsErrorString s

你应该有:

return (containsErrorString s)
于 2013-09-19T01:17:39.773 回答
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
于 2013-09-19T08:10:12.697 回答