3

所以我只是想处理同构并且可以使用手。

我正在编写一个文本编辑器,我想根据任务以两种不同的方式考虑光标的位置,或者作为(行,列)的元组,或者作为文本对象的单个整数偏移量。

我正在使用镜头构建整个东西,所以这似乎是了解 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 Intto的同构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

还是有更好/更简单的方法?这些可以从我的实例中得出吗?

有谁知道一些好的镜头同构示例或教程?谷歌没有太多帮助:/

谢谢您的帮助!只是想检查一下,以确保我做的一切都是惯用的。

4

0 回答 0