Haskell中的附加用例
在过去的几天里,我一直在仔细阅读。当我开始从理论的角度理解它们的重要性时,我想知道人们如何以及为什么在Haskell中使用它们。提供一个实现,其实例中有functor和。同样,从理论的角度来看,这些都非常有趣,但我不知道如何将它们用于更实际的编程问题 有没有人用Haskell中的附加用例,haskell,functor,category-theory,Haskell,Functor,Category Theory,在过去的几天里,我一直在仔细阅读。当我开始从理论的角度理解它们的重要性时,我想知道人们如何以及为什么在Haskell中使用它们。提供一个实现,其实例中有functor和。同样,从理论的角度来看,这些都非常有趣,但我不知道如何将它们用于更实际的编程问题 有没有人用Data.Functor.Adjunction解决编程问题的例子,以及为什么您更喜欢这个实现而不是其他实现?初步说明:这个答案有点推测性。很像这个问题,它是通过研究Data.Functor.Adjunction构建的 我可以想出三个原因来
Data.Functor.Adjunction
解决编程问题的例子,以及为什么您更喜欢这个实现而不是其他实现?初步说明:这个答案有点推测性。很像这个问题,它是通过研究Data.Functor.Adjunction
构建的
我可以想出三个原因来解释为什么附加类的用例不多
首先,所有Hask/Hask附加语最终都是currying附加语的一些变体,因此潜在实例的范围一开始并不那么大。人们可能感兴趣的许多附加语不是Hask/Hask
其次,虽然一个附加实例免费提供了大量其他实例,但在许多情况下,这些实例已经存在于其他地方。举一个ur示例,我们可以很容易地在以下方面实现StateT
:
然而,没有人需要真正做到这一点,因为变形金刚中有一个完美的StateT
。这就是说,如果您确实有自己的附加实例,您可能会很幸运。我认为有一点可能是有意义的(即使我还没有真正看到它),那就是以下函子:
data Dilemma a = Dilemma { fstDil :: a, sndDil a }
data ChoiceF a = Fst a | Snd a
我们可以编写一个附加ChoiceF diffuse
实例,它反映了diffuse(ChoiceF a)
是如何实现状态Bool a
的<代码>困境(ChoiceF a)
可以被认为是决策树中的一个步骤:选择困境的一侧
通过ChoiceF
构造函数告诉您接下来要做什么选择。然后,附加
实例将为我们免费提供一个用于困境(ChoiceF a)
的monad转换器
(另一种可能性可能是利用。共自由困境a
是一棵无限的结果树,而自由选择a
是一条通向结果的道路。我敢说,要走出这一困境还有一段路要走。)
第三,虽然在Data.Functor.adjuncation
中有许多用于右伴随词的有用函数,但它们提供的大部分功能也可以通过Representable
和/或Distributive
获得,因此它们可能被使用的大多数地方最终都会使用超类
当然,Data.Functor.Adjunction也为左伴随词提供了有用的函数。一方面,左伴随(同构于成对,即包含单个元素的容器)可能不如右伴随(同构于函数,即具有单个形状的函子)灵活;另一方面,似乎没有任何关于左伴随词的规范类(至少还没有),因此这可能导致实际使用Data.Functor.Adjunction
函数的机会。顺便说一句,您的建议可以说是符合要求的,因为它确实依赖于左伴随以及如何使用它来编码右伴随的表示:
zapWithAdjunction :: Adjunction f u => (a -> b -> c) -> u a -> f b -> c
zapWithAdjunction @CoordF @Board :: (a -> b -> c) -> Board a -> CoordF b -> c
checkHit :: Vessel -> Weapon -> Bool
shoot :: Board Vessel -> CoordF Weapon -> Bool
CoordF
,左伴随,携带电路板和有效载荷的坐标ZapWithAddition
使使用有效载荷时(在这种情况下,相当准确地说)可以瞄准目标位置。我可能(非常容易)出错,但我认为,Data.Functor.Adjunction
的存在主要是为了证明附加的绝对概念可以用Haskell来表示。在一个虚构的游戏中有一个用例:我自己还没有完成这篇文章。吹毛求疵:你链接到的第一个实例不是自由/健忘的附加,但是Hask/Hask左伴随的自由单子和相应的Hask/Hask右伴随的余余余单子之间的一个附加。谢谢你这么多的洞察力。这是我暂时思考的食物。
zapWithAdjunction :: Adjunction f u => (a -> b -> c) -> u a -> f b -> c
zapWithAdjunction @CoordF @Board :: (a -> b -> c) -> Board a -> CoordF b -> c
checkHit :: Vessel -> Weapon -> Bool
shoot :: Board Vessel -> CoordF Weapon -> Bool