问题标签 [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 投票
0 回答
259 浏览

haskell - 泛型派生双函子的现代 haskell 实现

我正在寻找一种自动派生双函子fmapFirst的方法fmapSecond。我更喜欢使用新Generic类型类或 usingData.Data并且没有 Template Haskell 的方法。

(请注意,我已经知道https://hackage.haskell.org/package/genifunctors-0.2.2.0/docs/Data-Generics-Genifunctors.html使用 Template Haskell 支持这一点,我想知道 Template Haskell 是否可以这里避免)

0 投票
3 回答
10612 浏览

java - BiFunction 引用可以传递给期望函数接口的方法吗?

我一直只使用 Java 6,现在正在赶上学习 Java 8 的新功能。我在这里阅读了这篇文章: http ://www.drdobbs.com/jvm/lambda-expressions-in-java-8 /240166764?pgno=2

它说:

Java API 在 java.util.function 包中定义了几个通用功能接口。其中一个接口 BiFunction 描述了具有参数类型 T 和 U 以及返回类型 R 的函数。您可以将我们的字符串比较 lambda 保存在该类型的变量中:

但是,这并不能帮助您进行排序。没有需要 BiFunction 的 Arrays.sort 方法。如果您以前使用过函数式编程语言,您可能会觉得这很奇怪。但是对于 Java 程序员来说,这很自然。诸如 Comparator 之类的接口具有特定用途,而不仅仅是具有给定参数和返回类型的方法。Java 8 保留了这种风格。当您想使用 lambda 表达式做某事时,您仍然希望牢记表达式的用途,并为其提供特定的功能接口。

但是,当我看到这个线程时: How do you assign a lambda to a variable in Java 8?

那里的问题的答案建议完全按照引用的段落所说的做你不能做的事情。

那么,文章中的信息是不正确的,还是我在这里误读了什么?

谢谢!

0 投票
1 回答
97 浏览

haskell - 关于推断 ADT 的 fmap

假设两个新类型是这样定义的

……那FType1andFtype2都是Functor.

如果现在要声明MyProductTypeandMyCoproductType作为 的实例Functor,编译器是否需要为它们各自fmap的 's 明确定义,还是可以从以前的定义中推断出这些定义?

另外,这个问题的答案是依赖于实现的,还是遵循 Haskell 规范?


作为背景,这个问题的动机是试图理解我正在阅读的内容中的一句话。作者首先定义

...然后写(我的重点)

...Writer类型构造函数在a. 我们甚至不需要实现fmap它,因为它只是一个简单的产品类型。

强调的文字是我试图理解的评论。我认为这意味着 Haskell 可以根据函数类型推断任何fmapADT 的's ,特别是,它可以推断“简单产品类型”之类的我正在正确阅读Ørjan Johansen的答案)。fmapWriter

至于作者那句话是什么意思,现在我真的不知道了。也许他的意思是,不值得费心地重新定义Writer它的功能性可以明确,因为它是一种“简单......类型”。(在这里抓住稻草。)

0 投票
1 回答
110 浏览

haskell - 代表性双函子的不动点

Edward Kmett 的实验性角色包提供了各种用于解除强制的实用程序,其中一些我已粘贴在本问题的末尾。包中的关键类是

给定类型

我希望写一些类似的东西

我相信以下应该有效,除了一个缺失的部分。我也有点担心,这bar可能足够严格,以至于把所有东西都扔进一个无限循环。

点点滴滴roles

0 投票
1 回答
98 浏览

haskell - 将 Iso 提升到 Bifunctor 的第一个参数中

Control.Lens.Iso包含许多出色的函数,用于将Isos 提升为有用抽象的各种类型参数。例如:

  • mapping对于任意Functors
  • contramapping对于Contravariant函子
  • dimapping,对于s lmapping_rmappingProfunctor
  • bimappingBifunctors

我正在寻找将 a 提升Iso到 a 的first参数的函数Bifunctor,但它似乎不存在。我目前正在这样定义它:

这个功能是否已经存在于某个地方,或者已经具备bimapping p (iso id id)了?

0 投票
0 回答
123 浏览

haskell - 什么是等效于 bitraverse 的镜头?

有没有办法创建一个可以做类似这个功能的镜头?

我目前试图满足的具体类型是:

我一直在尝试使用traverseOfboth从镜头,但似乎无法使类型对齐。

0 投票
2 回答
221 浏览

scala - Hom Functor 的逆变性和 Scala 的 Function1 之间有什么联系吗?

Hom 函子 在第一个参数中是逆变的Hom(-,-),在第二个参数中是协变的。

这个事实能否以某种方式提供另一种解释,为什么 Scala 的Function1[-T1, +R]具有相同的属性?

例如,我在这里看到了这种说法,但是在应该解释这两个概念之间的联系的地方,有太多的挥手让我大吃一惊。

0 投票
1 回答
82 浏览

scala - 双函子的参数化类型别名

我有一个Seq[R],我想把它分成一个Tuple2[Seq[E], Seq[S]],在我编码这个的时候,我想到了一个事实,我可以Bifunctor为一个 seqs 的元组使用一个自定义,并且作为练习试图编码这个:

这工作正常,但由于某种原因对我来说晦涩难懂,我不得不声明一个参数化类型别名来使所有这些编译,也就是说type MyType[E, S] = (Seq[E], Seq[S]),我几乎不明白为什么这行得通,而这行不通:

[错误] ... (Seq[E], Seq[S]) 没有类型参数,预期:两个

[错误] def myValBimap[E, S] = new Bifunctor[Tuple2[Seq[E], Seq[S]]] {

当定义了这样的类型别名时,编译器是否创建了 2-type 暂停(可能像嵌套的 lambda 类型?)?

0 投票
1 回答
256 浏览

haskell - 双胞胎的方法是什么?

在思考什么更有用的标准类建议给这个

我突然想到,这里可能潜伏着一个更普遍的野兽,而不是VectorSpace-y or R2:a Type -> Type -> Type,它的两个包含的类型都可以被提取。嗯,也许他们可以被extract教育

原来comonadnorbifunctors包都不包含名为Bicomonad. 问题是,从理论上讲,这样的课程是否有意义?不像Bimonad(它也没有定义,我真的看不出它看起来如何),一个天真的定义似乎是合理的:

可能与法律有关

但是我发现令人不安的是,结果的两个字段都bidup包含相同的类型,并且还有很多其他的,也许是“更好”的可以想象的签名。

有什么想法吗?

0 投票
1 回答
3394 浏览

haskell - 什么是双函子?

我对 Haskell 比较陌生,并且无法理解双函子的实用性。我想我在理论上理解它们:例如,如果我想映射一个抽象多个具体类型的类型,例如 Either 或 Maybe,我需要将它们封装在一个双函子中。但一方面,这些示例似乎特别做作,另一方面,您似乎可以简单地通过组合来实现相同的功能。

例如,我在Jeremy Gibbons 和 Bruno C的 The Essence of the Iterator Pattern中遇到了这段代码。S.奥利维拉:

我理解重点是组合映射和折叠函数来创建迭代器模式,这是通过定义需要两个参数的数据构造函数来实现的。但在实践中,我不明白这与使用常规函子并使用 fmap 而不是 bimap 组合函数有何不同。我认为我显然必须遗漏一些东西,无论是在这个例子中,还是在一般情况下。