为什么不通过 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
为什么下面的代码不会报错?相反,它会立即退出。
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