所以我只是想处理同构并且可以使用手。
我正在编写一个文本编辑器,我想根据任务以两种不同的方式考虑光标的位置,或者作为(行,列)的元组,或者作为文本对象的单个整数偏移量。
我正在使用镜头构建整个东西,所以这似乎是了解 Isos 的好地方。
最初我有一个Buffer
对象:
data Buffer = Buffer {
_text :: T.Text
, _cursor :: Int
} deriving (Show, Eq)
makeLenses ''Buffer
但现在游标可能是 (row, col) 元组,我已将其更改为:
data Buffer c = Buffer {
_text :: T.Text
, _cursor :: c
} deriving (Show, Eq)
makeLenses ''Buffer
由于在缓冲区的上下文中,我有一个从Buffer Int
to的同构Buffer (Int, Int)
(这种限制是因为我需要文本和偏移量才能进行转换),我希望我的所有函数都采用缓冲区操作,并且'只是工作'。
现在我被困在如何在我的定义中使其具有多态性,
我可以:
appendText :: T.Text -> Buffer c -> Buffer c
但是当然我实际上根本无法使用光标,因为它完全没有类型。
我能找到的唯一大致相关的库是这个type-iso库,它看起来不是很流行。那个,我找不到任何博客文章的想法让我想知道这是否是人们做的事情?
如果这是一个很好的库,我想我需要为 Isomorphic 编写一个实例,如果我为Injective编写每个实例,我似乎可以免费获得这个,但我找不到任何文档或示例我很容易理解,所以我想检查这是否是惯用的方式。如果这是正确的,我是使用同构约束还是内射约束?
编辑:我稍微摆弄了一下,似乎我确实可以实现 Injective 并免费获得 Iso,但同样,这个库似乎并不受欢迎,所以我正在寻找惯用的方法。
最后,对于我的镜头isos,我必须写:
toRowColumn :: Iso' (Buffer Offset) (Buffer (Int, Int))
toRowColumn = iso to to
toOffset :: Iso' (Buffer (Int, Int)) (Buffer Offset)
toOffset = iso to to
还是有更好/更简单的方法?这些可以从我的实例中得出吗?
有谁知道一些好的镜头同构示例或教程?谷歌没有太多帮助:/
谢谢您的帮助!只是想检查一下,以确保我做的一切都是惯用的。