【发布时间】:2019-07-27 21:46:30
【问题描述】:
我正在使用hspec 进行一些基本测试。
我有一个argsParser 函数,它给出了一些参数,返回或者打印它们的有效性。
argsParser :: [String] -> IO ()
argsParser args | null args = print "no args provided"
| not $ null args && length args < 2 = print "no file name provided"
| length args > 2 == print "too many arguments"
| otherwise = goAhead args
问题是我不确定如何将IO () 与另一个IO () 进行比较。
我认为liftIO 可能会有所帮助
x <- liftIO $ print "something"
y <- liftIO $ print "anything"
我明白了
x == y = True
我怀疑是因为两者都是actions。
【问题讨论】:
-
x==y是True,因为x和y都是()。它们不是动作 - 如果您定义x = ...而不是x <- ...,就会出现这种情况,在这种情况下您会收到错误,因为无法检查类型IO ()是否相等。 -
您可以使用免费的 monad 来获得平等性和可测试性,但它们是有代价的:请参阅 stackoverflow.com/questions/13352205/what-are-free-monads(您可以在此处阅读有关警告和替代方案:markkarpov.com/post/free-monad-considered-harmful.html)
-
argsParser做的事情太多了。argsParser :: [String] -> Either ArgsError [String]之类的东西要么返回有效字符串,要么返回其他函数可以处理的错误 (data ArgsError = NoArgs | NoFilename | TooManyArgs)。
标签: haskell