我如何推广同构?

时间:2016-11-18 04:43:47

标签: haskell lens isomorphism

所以我只是试图处理同构,并且可以用一只手。

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

我使用镜头构建整个镜头,所以这似乎是了解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 IntBuffer (Int, Int)的同构(这种约束是因为我需要文本AND偏移量来进行转换),I'我喜欢拥有缓慢行动的所有功能,只是工作'。

现在我一直坚持如何在我的定义中使其变为多态

我能做到:

appendText :: T.Text -> Buffer c -> Buffer c

但当然我根本无法使用光标,因为它完全没有类型。

我能找到的唯一大致相关的lib是这个type-iso库, 它看起来不太受欢迎。那个,我无法找到任何博客文章的想法让我想知道这是否是人们做的事情?

如果这是一个很好用的库, 我认为我需要为Isomorphic编写一个实例,如果我为Injective编写每个实例,我似乎可以免费获得此实例,但我无法找到任何文档或者我可以很容易理解的例子,所以我想检查这是否是惯用的方式。如果这是正确的,我是否使用同构约束或内射约束?

编辑:我稍微摆弄它似乎确实可以实现Injective并免费获得Iso,但同样,这个lib看起来并不受欢迎,所以我和#39;我正在寻找惯用的方法。

最后,对于我的镜头isos,我必须写:

toRowColumn :: Iso' (Buffer Offset) (Buffer (Int, Int))
toRowColumn = iso to to

toOffset :: Iso' (Buffer (Int, Int)) (Buffer Offset)
toOffset = iso to to

或者有更好/更简单的方法吗?这些可以从我的实例派生出来吗?

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

感谢您的帮助!只是想要办理登机手续以确保我能正常地做一切。

0 个答案:

没有答案