如何检查一个IO()是否等效于另一个IO()?

dis*_*obs 0 haskell

我正在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
Run Code Online (Sandbox Code Playgroud)

问题是我不确定如何IO ()与另一个进行比较IO ()

我以为可能liftIO会有所帮助

x <- liftIO $ print "something"
y <- liftIO $ print "anything"
Run Code Online (Sandbox Code Playgroud)

我懂了

x == y = True
Run Code Online (Sandbox Code Playgroud)

我怀疑是因为两者都是actions

chi*_*chi 12

您无法将IO操作与其他操作进行比较。可计算性理论指出,无法确定两个IO值是否相等。因此,Eq (IO a)Haskell中没有实例。

充其量,您可以尝试运行这两个动作,从外部观察它们的效果,然后比较它们的效果-这并不总是可行的(例如,如果一个动作是一个无限循环,如果该动作需要用户输入),但是可以足够接近。可以通过将操作作为子流程运行,重定向其标准输出/错误来实现此检查。

(不过,为什么要比较IO操作?这很不寻常)