Haskell 如果很难恢复容器,“存储”命令有什么意义?
,此观察结果可用于获得一些有用的效果,例如模板卷积。此外,还注意到,Haskell 如果很难恢复容器,“存储”命令有什么意义?,haskell,comonad,Haskell,Comonad,,此观察结果可用于获得一些有用的效果,例如模板卷积。此外,还注意到,实例通过(通过部分应用的索引函数)进行编码,其工作原理与手写定义相同 但这种方法有一个缺点:存储本质上是一个函数,一旦某个东西变成了一个函数,返回就不舒服了。我注意到,需求中的一个小变化要求我们完全放弃comonad的概念,回到对初始容器的考虑。我发现:局部转换很容易,但它们需要的上下文越多,就越复杂。可以通过在光标空间的相应子集上迭代提取来恢复初始容器的任何部分,但是为什么首先要用初始类型替换最终类型呢 换句话说,有两种方法来
实例通过(通过部分应用的索引函数)进行编码,其工作原理与手写定义相同
但这种方法有一个缺点:存储本质上是一个函数,一旦某个东西变成了一个函数,返回就不舒服了。我注意到,需求中的一个小变化要求我们完全放弃comonad的概念,回到对初始容器的考虑。我发现:局部转换很容易,但它们需要的上下文越多,就越复杂。可以通过在光标空间的相应子集上迭代提取来恢复初始容器的任何部分,但是为什么首先要用初始类型替换最终类型呢
换句话说,有两种方法来表示容器,这两种方法同样有助于定义实例comanad
:
作为“初始”数据类型。如果没有依赖类型,当容器与索引配对时,Haskell中的instance Comonad
的平凡定义是局部的(索引可能指向容器形状之外的位置),但它仍然有效
作为“最终”部分应用的索引函数。通过将容器包装在商店
中,可以将其制成comonad。然后自动将其与索引配对。偏袒论同样适用,所以没有安全可言
当初始类型被交换为最终函数时,为初始类型定义的所有方法都将丢失,直到通过或多或少的细化恢复为止。考虑到访问一个有限的小容器是不安全的(大多数索引是未定义的),并且容器本身无法被查询,编程就变成了扫雷游戏。我没有特意放入环境中的初始容器的任何属性都将丢失。总之,无论商店
应该提供什么样的安全或便利好处,都会受到处理集装箱最终代表的困难的挑战
简而言之,一个指向的容器是一个comonad,但Store只是一个comonad
那么,《代码》商店的动机是什么呢?我们能不能买到一个实例comanad
,或者至少更便宜一些?没有人喜欢商店?我非常喜欢商店
!但我对这个问题有点困惑:澄清一下,你是在问为什么有人会使用数据存储sa=Store(s->a)a
而不是像列表或地图这样的具体数据类型?@bradrn是的!或者更确切地说,为什么它是这样设计的——最终编码容器的抽象理由是什么?(因为任何comonad都必须是一个容器,它也允许使用数据构造函数进行初始表示。)可能是因为它允许您根据其索引类型来表示任何容器storekv
是一个点映射,storeinta
是一个无限列表,storeboola
是一个2元组……一般来说,我觉得你可以用一种类型来表示任何容器都很简洁。(如果你想进一步了解这一点,请看一下Representable
)。但是,仅仅因为某些东西在理论上是整洁的,并不意味着它是实用的或有效的!