haskell - 为什么镜头包含用于 fromEnum/toEnum 的 Iso,而不包含用于显示/读取的 Iso?

标签 haskell haskell-lens

假设您声明两个同构

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 :“这只是与实际使用的数字范围的同构"),而在读取方面,事情就有点模糊了。另一个区别是 toEnumEnum 的一种方法(并且是最小实例定义中所需的方法),而 read 不是实际上是一种Read方法,因此从某种意义上来说,不太重要(事实上,基本文档 explicitly discourage its usage )。

更一般地说,当需要在公开防弹接口(interface)和包含有用但可能不安全或非法的组合器之间进行选择时,lens 通常会选择后者,使它们可供那些人使用谁希望使用它们,同时确认文档中的任何潜在问题(或者,在更复杂的情况下,函数和模块名称中)。鉴于lens是一个非常通用的库,这种方法可以被视为一种非固执己见的选择——在这样的背景下,很难弥补组合器的缺失。

P.S.:还值得注意的是,lens 通过 the _Show prism 编码 readshow_Show 相当于 prism' show readMaybe,并且对于 Read 值的偏向性是安全的。

关于haskell - 为什么镜头包含用于 fromEnum/toEnum 的 Iso,而不包含用于显示/读取的 Iso?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50671906/

相关文章:

haskell - 非法实例声明/重叠实例

haskell - 具有两个以上选项的 Tuple 或 Either 的相反名称是什么?

haskell - 在状态 monad 中使用 lens 访问数组元素

haskell - 如何使 Control.Lens 中的 (Fold s a) 成为幺半群?

带遍历的 Haskell Lens 教程

haskell - 使用镜头两次

Haskell:有时返回函数的函数

haskell - 使用向量 `create` 函数组合任何函数时出现类型错误

haskell - 在 Haskell 的 case 语句中使用默认值

haskell - 使用镜头的 3 种或更多类型之间的同构