假设您声明两个同构
showing :: (Read a, Show a) => Iso' String a
showing = iso read show
reading :: (Read a, Show a) => Iso' a String
reading = iso show read
它们是不安全的,并不是每个字符串都会解析为 a。
这就引出了一个问题:如果 enum = iso fromEnum toEnum
包含在库中,为什么这两个不包含在库中?
它同样不安全,并且类型系统无法阻止。它们都将负担转移到程序员身上,程序员必须确保转换不会破坏同构。
简单示例:在枚举 (+1) True 下
将引发异常
最佳答案
警告:推测性答案如下。
我能想到的两种场景之间的一个区别是,当 toEnum
崩溃时,很容易澄清(引用 the lens docs :“这只是与实际使用的数字范围的同构"),而在读取
方面,事情就有点模糊了。另一个区别是 toEnum
是 Enum
的一种方法(并且是最小实例定义中所需的方法),而 read
不是实际上是一种Read
方法,因此从某种意义上来说,不太重要(事实上,基本文档 explicitly discourage its usage )。
更一般地说,当需要在公开防弹接口(interface)和包含有用但可能不安全或非法的组合器之间进行选择时,lens 通常会选择后者,使它们可供那些人使用谁希望使用它们,同时确认文档中的任何潜在问题(或者,在更复杂的情况下,函数和模块名称中)。鉴于lens是一个非常通用的库,这种方法可以被视为一种非固执己见的选择——在这样的背景下,很难弥补组合器的缺失。
P.S.:还值得注意的是,lens 通过 the _Show
prism 编码 read
和 show
。 _Show
相当于 prism' show readMaybe
,并且对于 Read
值的偏向性是安全的。
关于haskell - 为什么镜头包含用于 fromEnum/toEnum 的 Iso,而不包含用于显示/读取的 Iso?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50671906/