为什么不通过 Either 工作 fmap 任一错误 ID?

Why doesn't fmap either error id over an Either work?

为什么下面的代码不会报错?相反,它会立即退出。

someAction :: IO (Either String ())
someAction = return $ Left "Error"

main :: IO ()
main = either error id <$> someAction

执行IO ()类型的动作时,不计算其return值(单位):

  • In the interactive prompt:“GHCi 将打印 I/O 操作的结果,如果(且仅当)[...] 结果类型不是 ()。”
  • 当运行一个编译好的程序时(我已经验证了这个但是找不到参考!随意编辑)。
ioError 不同,

error 呈现为 String -> a 类型的纯函数。为了简化您的示例:

main :: IO ()
main = pure $ error "error"

运行 main 作为 IO 操作执行所有 side-effects(其中有 none)但不对 return 执行任何操作值,因此不对其进行评估。

但是,这会出错,因为 print 评估其参数(甚至 ()):

main >>= print