问题标签 [bifunctor]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
95 浏览

haskell - 带有类型变量的实例声明

写这样的东西很好用:

现在假设我想反转这个,Left 将 f 应用于值:

这不编译,我想我需要有类似的东西Functor (Either _ b),我该怎么做?

0 投票
2 回答
279 浏览

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

我在Either a b. 然后,我bind使用 Haskell-speak 中带有签名的函数是b -> (c, d),之后我想将其拉到c外部并在左侧情况下默认它,即我想要(c, Either a d)。现在这种模式多次出现在我正在编写的一个特定服务中,所以我提出了一种方法来实现它。然而,每当我在不理解正确的理论基础的情况下“编造”这样的方法时,我都会感到困扰。换句话说,我们在这里处理的是什么抽象?

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

这意味着当您从一对开始并想要将其“绑定”到它时它会很好用,但是当您从一个开始并希望以一对结束时它不起作用,因为 pair 不是Applicative

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

它甚至有一个cotraverse,因为它是双重的Travsersable!迷人的!!但是,我注意到没有(,)实例。哦哦。因为,是的,“默认c值”在哪里出现?然后我意识到,哦,我可能需要基于双函子的双向分配器之类的东西?也许双重到可比特遍历?从概念上讲:

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

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

0 投票
4 回答
407 浏览

haskell - 使用 Biapplicative 遍历

我正在考虑解压缩操作,并意识到表达它们的一种方法是遍历Biapplicative函子。

在我看来,好像每个实例Traversable都可以机械地转换为Traversable2. 但是我还没有找到一种方法来实际实现traverse2using traverse,除了在列表之间进行转换,或者可能使用unsafeCoerce. 有没有很好的方法来做到这一点?


进一步的证据表明任何事情Traversable都是Traversable2

0 投票
1 回答
2568 浏览

java - ConcurrentHashMap 中的合并函数

有一个关于 ConcurrentHashMaps 的合并功能的问题。函数式编程的新手,所以不确定我是否正确使用它。

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html#merge-KV-java.util.function.BiFunction-

如果我已经正确推理出来,insert (consumer, val)如果没有现有条目,它应该做的是进入表格。如果有,那么它应该比较 a 和 b 的日期(表中的值和我的 val)。如果“val”大于表中的条目,则应将其替换为该条目。否则,坚持现有条目。

感谢任何帮助。谢谢!

0 投票
1 回答
334 浏览

haskell - 如何在 Haskell 中派生多个 Functor 实例?

我正在为表达式定义一个 AST,它具有三个类型参数,如下所示:

现在 usingDeriveFunctor只能帮助我定义instance Functor (Expr r a1),所以我可以fmapover a2,但是如果我想fmapover a1or r,我发现无法使用DeriveFunctora newtype,因为以下代码不起作用:

如果我只需要两个类型参数,那么Bifunctor可能是个好主意,并且确实有一些包提供DeriveBifunctor,但是如果我们需要三个呢?我们需要DeriveTrifunctorDeriveQuadfunctor吗?

而且,如果我们需要更多Functor呢?考虑FoldableTraversable_

这个问题有什么解决办法吗?人们如何在haskell实践中解决这个问题?

0 投票
0 回答
90 浏览

scala - BiFunctor 的隐式参数

我打算将 BifunctorIO与错误通道一起使用。所以我试图为它提供一个隐式实例,MonadError但它无法编译。

例如猫生物cats.BIO[+E, +A]

我得到了编译错误

我真的不明白如何解决这个要求MonadError[F[_], A]

0 投票
1 回答
70 浏览

haskell - Haskell 独立决定为我的数据类型推断 Bifunctor?

出于某种原因,GHC 似乎决定我的数据类型(具有两个类型参数)完全无缘无故地实例化 Bifunctor。

最有趣的是,这仅用于告诉我该数据类型存在重叠的 Functor 实例,因为我为任何 Bifunctor(以及数据类型的特定实例)提供了 Functor 的实例化。但是,如果我尝试对其进行 bimap,它会告诉我没有 Bifunctor 的实例。

我希望这样,因为我没有提供任何东西来表明 Provenance 实例化 Bifunctor,它不会,因此从 Bifunctor 派生的 Functor 实例应该是无关紧要的。这是 FlexibleInstances 的错误吗?

0 投票
2 回答
404 浏览

haskell - 双函子与箭头方法

BifunctorArrow方法之间有一些重叠:

该类Bifunctor带有与那些完全类似的法律Functor

该类Arrow带有许多不同的定律和一个有点神秘的警告(***):“请注意,这通常不是函子。” 令人惊讶的是(对我来说)只有一条关于 的法律(***)

Arrow (->)实例和实例完全匹配,Bifunctor (,)所以bimap @(,) = (***) @(->). 这有什么特别的意义吗?有没有有意义的假设

如果是这样,那是否承认功能依赖?

0 投票
1 回答
81 浏览

haskell - 为什么 Data.Bifunctor 中的“first”不转换这个值

在下面的:

当我运行时,runExceptT $ safeDecodeJSONFile "something" "nonExistantFile.json"我希望得到Left "Does not exist something",但我只是得到Left "Does not exist"- 我知道我传递给的函数first正在执行,因为没有packGHC 抱怨类型(eitherDecode (BLU.fromString (unpack contents)))ExceptT String IO a而不是ExceptT Text IO a- 那么为什么连接++也不会发生呢?

0 投票
3 回答
119 浏览

haskell - Bifunctor 实例定义上的类型签名不匹配

我通过阅读First Principles, Allen & Moronuki 的 Haskell Programming 一书来了解 Haskell 。

在 Monad Transformers, Functor & Applicative composition 一章的练习中,它要求读者为以下类型编写 Bifunctor 实例

我的第一次尝试(编译)是

但是,看着它,在我看来,我应该能够写bimap f g = id,因为最后一个参数是不变的或 write bimap f g x = x。两者都给了我编译错误,我希望有人能向我解释为什么我不能bimap用这些较短的替代方案来表达,即为什么我必须指定(SemiDrei a).

我在 Haskell 8.6.5 上运行了这个(如果相关的话)

尝试:身份证

尝试:fgx = x