【发布时间】:2014-09-09 20:04:21
【问题描述】:
我试图在选择 readIO 而不是 read 时权衡取舍,我写了这 2 个 sn-ps
> map read . words <$> getLine :: IO [Int]
1 2 a
[1,2,*** Exception: Prelude.read: no parse
> mapM readIO . words =<< getLine :: IO [Int]
1 2 a
*** Exception: user error (Prelude.readIO: no parse)
我知道在纯代码中抛出异常(就像 read 一样)通常很糟糕,但通常我总是在 IO monad 中使用 read,因此我应该几乎总是能够捕获异常。
readIO 并没有在我所看到的那么多 sn-ps/examples/tutorials 中使用,但是 otoh 携带类型错误的可能性似乎是一件好事,并收集所有 Read a in带有mapM 的单个 IO 产生的错误早于带有纯 map 的第一个示例。快速失败通常是令人垂涎的属性。
我应该四处走走,用readIOs 替换所有reads 吗?
【问题讨论】:
标签: haskell