Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell中的附加用例_Haskell_Functor_Category Theory - Fatal编程技术网

Haskell中的附加用例

Haskell中的附加用例,haskell,functor,category-theory,Haskell,Functor,Category Theory,在过去的几天里,我一直在仔细阅读。当我开始从理论的角度理解它们的重要性时,我想知道人们如何以及为什么在Haskell中使用它们。提供一个实现,其实例中有functor和。同样,从理论的角度来看,这些都非常有趣,但我不知道如何将它们用于更实际的编程问题 有没有人用Data.Functor.Adjunction解决编程问题的例子,以及为什么您更喜欢这个实现而不是其他实现?初步说明:这个答案有点推测性。很像这个问题,它是通过研究Data.Functor.Adjunction构建的 我可以想出三个原因来

在过去的几天里,我一直在仔细阅读。当我开始从理论的角度理解它们的重要性时,我想知道人们如何以及为什么在Haskell中使用它们。提供一个实现,其实例中有functor和。同样,从理论的角度来看,这些都非常有趣,但我不知道如何将它们用于更实际的编程问题

有没有人用
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