gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:45:27 25 4
gpt4 key购买 nike

假设您声明两个同构

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com