这是我的第一次Haskell尝试,所以我的理解相当有限。我想编写一个非常基本的程序来检查文件是否包含单词ERROR
。我想出了以下内容,当然甚至都没有编译。
import Text.Regex.Posix
containsErrorString :: String -> Bool
containsErrorString x = x =~ "ERROR" :: Bool
fileContainsErrorString fileName = do
s <- readFile fileName
containsErrorString s
这是正确的方法,如果没有,那么正确的方法是什么?
由于
答案 0 :(得分:5)
轻重写
我建议:
Text
代替String
代表任何&#34;严重的&#34;工作在代码中:
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