问题标签 [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.
haskell - 带有类型变量的实例声明
写这样的东西很好用:
现在假设我想反转这个,Left 将 f 应用于值:
这不编译,我想我需要有类似的东西Functor (Either _ b)
,我该怎么做?
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(...)
函数(扩展方法)来替换它并在调用它之前将左案例的“默认”映射到左案例(或者只是识别“双向分配”字符“由内而外”)?
haskell - 使用 Biapplicative 遍历
我正在考虑解压缩操作,并意识到表达它们的一种方法是遍历Biapplicative
函子。
在我看来,好像每个实例Traversable
都可以机械地转换为Traversable2
. 但是我还没有找到一种方法来实际实现traverse2
using traverse
,除了在列表之间进行转换,或者可能使用unsafeCoerce
. 有没有很好的方法来做到这一点?
进一步的证据表明任何事情Traversable
都是Traversable2
:
java - ConcurrentHashMap 中的合并函数
有一个关于 ConcurrentHashMaps 的合并功能的问题。函数式编程的新手,所以不确定我是否正确使用它。
如果我已经正确推理出来,insert (consumer, val)
如果没有现有条目,它应该做的是进入表格。如果有,那么它应该比较 a 和 b 的日期(表中的值和我的 val)。如果“val”大于表中的条目,则应将其替换为该条目。否则,坚持现有条目。
感谢任何帮助。谢谢!
haskell - 如何在 Haskell 中派生多个 Functor 实例?
我正在为表达式定义一个 AST,它具有三个类型参数,如下所示:
现在 usingDeriveFunctor
只能帮助我定义instance Functor (Expr r a1)
,所以我可以fmap
over a2
,但是如果我想fmap
over a1
or r
,我发现无法使用DeriveFunctor
a newtype
,因为以下代码不起作用:
如果我只需要两个类型参数,那么Bifunctor
可能是个好主意,并且确实有一些包提供DeriveBifunctor
,但是如果我们需要三个呢?我们需要DeriveTrifunctor
等DeriveQuadfunctor
吗?
而且,如果我们需要更多Functor
呢?考虑Foldable
等Traversable
_
这个问题有什么解决办法吗?人们如何在haskell实践中解决这个问题?
scala - BiFunctor 的隐式参数
我打算将 BifunctorIO
与错误通道一起使用。所以我试图为它提供一个隐式实例,MonadError
但它无法编译。
例如猫生物:cats.BIO[+E, +A]
我得到了编译错误
我真的不明白如何解决这个要求MonadError[F[_], A]
。
haskell - Haskell 独立决定为我的数据类型推断 Bifunctor?
出于某种原因,GHC 似乎决定我的数据类型(具有两个类型参数)完全无缘无故地实例化 Bifunctor。
最有趣的是,这仅用于告诉我该数据类型存在重叠的 Functor 实例,因为我为任何 Bifunctor(以及数据类型的特定实例)提供了 Functor 的实例化。但是,如果我尝试对其进行 bimap,它会告诉我没有 Bifunctor 的实例。
我希望这样,因为我没有提供任何东西来表明 Provenance 实例化 Bifunctor,它不会,因此从 Bifunctor 派生的 Functor 实例应该是无关紧要的。这是 FlexibleInstances 的错误吗?
haskell - 双函子与箭头方法
Bifunctor
和Arrow
方法之间有一些重叠:
该类Bifunctor
带有与那些完全类似的法律Functor
。
该类Arrow
带有许多不同的定律和一个有点神秘的警告(***)
:“请注意,这通常不是函子。” 令人惊讶的是(对我来说)只有一条关于 的法律(***)
:
Arrow (->)
实例和实例完全匹配,Bifunctor (,)
所以bimap @(,) = (***) @(->)
. 这有什么特别的意义吗?有没有有意义的假设
如果是这样,那是否承认功能依赖?
haskell - 为什么 Data.Bifunctor 中的“first”不转换这个值
在下面的:
当我运行时,runExceptT $ safeDecodeJSONFile "something" "nonExistantFile.json"
我希望得到Left "Does not exist something"
,但我只是得到Left "Does not exist"
- 我知道我传递给的函数first
正在执行,因为没有pack
GHC 抱怨类型(eitherDecode (BLU.fromString (unpack contents)))
是ExceptT String IO a
而不是ExceptT Text IO a
- 那么为什么连接++
也不会发生呢?
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