gpt4 book ai didi

haskell - 有没有双向分配之类的东西?我在这里需要什么功能?

转载 作者:行者123 更新时间:2023-12-04 14:23:10 25 4
gpt4 key购买 nike

我有代码(实际上是在 C# 中,但这个问题与 C# 没有任何关系,所以我将用 Haskell-speak 谈论我的所有类型)我在 Either a b 内部工作.我然后bind一个函数,其签名在 Haskell 语言中是 b -> (c, d) , 之后我想拉 c到外面并在左边的情况下默认它,即我想要(c, Either a d) .现在这种模式多次出现在我正在编写的一个特定服务中,所以我提出了一种方法来实现它。然而,每当我在不了解正确的理论基础的情况下“编造”这样的方法时,我都会感到困扰。换句话说,我们在这里处理的是什么抽象?

我在一些 F# 代码中遇到了类似的情况,其中我的一对和我的一对被颠倒了:(a, b) -> (b -> Either c d) -> Either c (a, d) .我问一个 friend 这是什么,他把我转到 traverse这让我非常高兴,尽管由于缺少类型类,我不得不在 F# 中进行可怕的单态实现。 (我希望我可以将我在 Visual Studio 中的 F1 重新映射到 Hackage;它是我编写 .NET 代码的主要资源之一)。但问题是遍历是:

class (Functor t, Foldable t) => Traversable t where
traverse :: Applicative f => (a -> f b) -> t a -> f (t b)

这意味着当您从一对开始并希望将其“绑定(bind)”到它时效果很好,但是 不工作当您以 a 开头并希望以 pair 结尾时,因为 pair 不是 Applicative .

但是我更多地考虑了我的第一个案例,那个不是 traverse ,并意识到“在左侧情况下默认 c”可以通过映射左侧情况来完成,这会将问题更改为具有以下形状: Either (c, a) (c, d) -> (c, Either a d)我认为这是我们在乘法和加法运算中看到的模式: a(b + c) = ab + ac .我还记得 bool 代数和集合论中存在相同的模式(如果没记错的话, A intersect (B union C) = (A intersect B) union (A intersect C))。显然这里有一些抽象的代数结构。然而,内存不起作用,我不记得它叫什么了。在 Wikipedia 上浏览一下很快就解决了这个问题:这些是 distributive法律。欢乐,噢,欢乐,Kmett 给了我们 distribute :
class Functor g => Distributive g where
distribute :: Functor f => f (g a) -> g (f a)

它甚至还有一个 cotraverse因为它是 Travsersable 的对偶!迷人的!!但是,我注意到没有 (,)实例。哦哦。因为,是的,“默认 c 值”在哪里出现?然后我意识到,呃,哦,我可能需要基于 bifunctor 的双向分配器之类的东西。 ?可能与 bitraversable 双重?从概念上讲:
class Bifunctor g => Bidistributive g where
bidistribute :: Bifunctor f => f (g a b) (g a c) -> g a (f b c)

这似乎就是我所说的分配律的结构。我在 Haskell 中找不到这样的东西,它本身对我来说并不重要,因为我实际上正在编写 C#。但是, 对我来说重要的是不要提出虚假的抽象,并且在我的代码中尽可能多地识别出合法的抽象,无论它们是否表达为我自己的理解 .

我目前有一个 .InsideOut(<default>)我的 C# 代码中的函数(扩展方法)(真是个 hack,对!)。我会完全偏离基础来创建一个(是的,可悲的是单态) .Bidistribute(...)函数(扩展方法)来替换它并在调用它之前将左大小写的“默认”映射到左大小写(或者只是识别“由内而外”的“双向分配”字符)?

最佳答案

bidistribute不能这样实现。考虑一个简单的例子

data Biconst c a b = Biconst c

instance Bifunctor (Biconst c) where
bimap _ _ (Biconst c) = Biconst c

那我们就有专攻了
bidistribute :: Biconst () (Void, ()) (Void, ()) -> (Void, Biconst () () ())
bidistribute (Biconst ()) = ( ????, Biconst () )

显然没有办法填补空白,需要输入 Void .

其实我觉得你真的需要 Either那里(或与之同构的东西)而不是任意的双仿函数。那么你的功能就是
uncozipL :: Functor f => Either (f a) (f b) -> f (Either a b)
uncozipL (Left l) = Left <$> l
uncozipL (Right r) = Right <$> l

定义为 in adjunctions (找到 using Hoogle)。

关于haskell - 有没有双向分配之类的东西?我在这里需要什么功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47945109/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com