当前位置: 首页 > 知识库问答 >
问题:

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

吕嘉赐
2023-03-14
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
x <- liftIO $ print "something"
y <- liftIO $ print "anything"

我得到

x == y = True

我怀疑这是因为两者都是操作

共有1个答案

严峰
2023-03-14

您不能将IO操作与另一个操作进行比较。可计算性理论指出,没有办法决定两个IO值是否等价。因此,在Haskell中没有实例eq(IO a)

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

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

 类似资料:
  • 问题内容: if var is ‘stringone’ or ‘stringtwo’: dosomething() 这行不通!我有一个变量,当它是两个值中的一个时,我需要它执行某些操作,但它不会输入if语句。在Java中工作。如何用Python编写? 问题答案: 这不能满足您的期望: 它与: 始终为真,因为它被认为是“真”值。 有两种选择: 或者您可以编写单独的相等性测试, 不要使用,因为比较对象

  • 每个数字都应该大于或等于另一个数字。如果所有数字相等,则返回false。 例子: 通常的方式是不断地除以10,然后比较余数。 null null

  • 我的两个列表中有以下元素,清单1[A F K]和清单2[B A C F K]。清单1的所有元素都在清单2中,因此它应该返回true 我尝试使用list1.containsAll(list2),但它并不支持我。 我尝试在这两个列表中循环,如果找到匹配,我就清空第一个列表中的那个位置,但这不起作用,因为我认为它会受到并发修改的影响。这是我的代码 在这里,subTreeList最终输出[A]。我知道它会

  • 问题内容: 我有两个arraylist 我想检查a2中是否存在a1的所有元素。这是我正在尝试的问题 这没有给出一致的结果…还有其他方法可以做到吗? 问题答案: 不知道我是否正确理解了您的问题,为什么使用? 试过这个: 它输出 添加一个额外的元素将使它失败(如预期): 它输出

  • 我需要检查一个arraylist中的任何值是否存在于另一个arraylist中: 它打印“它不包含”。我需要知道是否有方法比较这两个arraylist,如果其他arraylist中存在任何值,它应该返回。我知道迭代可以有所帮助。有什么简单的方法可以做到这一点吗?

  • 我使用AudioRecords API在我的应用程序中录制音频(WAV),它成功录制。但是当我在后台运行其他录制应用程序时尝试录制时,我的应用程序的行为很奇怪。 当另一台录音机正在运行时,MediaRecorder API会在尝试开始录制时引发异常,但AudioRecorder API会初始化录音机实例并且不会引发任何异常,因此我无法识别是否有任何录音机实例正在运行。 这种情况已经在三星S3的默认