问题标签 [traversable]

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 回答
246 浏览

scala - Traversable 是一个特征还是一个类

问题 1 -

在 Scala 文档中,我发现 Traversable 是一个带有抽象方法的特征foreach

http://www.scala-lang.org/docu/files/collections-api/collections.html

那么,为什么我可以实例化一个 Traversable 类型的对象呢?

问题 2 - Traversable 与 List 或 Array 等其他类有何不同?它是否属于 Seq、Set 或 Map 类别(我认为其他集合继承自 Traversable)

Iterable问题 3 -即使根据文档,Iterable 有一个抽象方法,我也可以对 trait 做同样的事情iterator

我错过了什么?

0 投票
2 回答
129 浏览

haskell - 为什么 Data.Traversable 中的“for”接受单子操作?

我正在研究以下一小段代码:

当我意识到我可以do用应用风格重写块时:

并且我也可以forMfor. 在进行上述更改之前,我for首先切换到:

令我惊讶的是,这仍然编译。给定 的定义 for

我认为Applicative约束会阻止我在传递给for.

我显然在这里遗漏了一些基本的东西,无论是for签名的真正含义,还是我发布的代码是如何被编译器解释的,如果能帮助理解正在发生的事情,我将不胜感激。

0 投票
0 回答
150 浏览

haskell - 理解混乱

我一直在考虑是否可以添加一些方法Traversable来使其在昂贵的仿函数存在的情况下更便宜地组合。灵感是Control.Lens.Traversal.confusing,它使用特殊Applicative来做类似的事情。

不幸的是,confusing它真的名副其实——我不明白它实际上在做什么。特别是,我对Curried.

此外,confusing它具有 CPS 的味道,这表明它可能对我的目的来说太严格了。Yoneda可以换掉Coyoneda以增强懒惰,但我不知道如何处理Curried.

0 投票
1 回答
469 浏览

haskell - 用列表压缩可遍历的最标准/通用的方法是什么?

Traversable从某种意义上说,它的结构具有“路径”(可以对应于列表)的容器类,可以在不分解结构的情况下修改其上的元素。因此

但是,这种列表状态遍历似乎有点骇人听闻,并且可能不是最有效的方法。我想会有一个标准功能可以完成上述或更一般的任务,但我不知道它会是什么。

0 投票
1 回答
105 浏览

haskell - 没有中间列表的过滤列表笛卡尔积

我正在尝试从给定的列表列表中创建过滤的笛卡尔积。天真的解决方案如下:

traversable 是否足够强大,可以在不创建中间列表的情况下完成它?有没有一种惯用的方法来做到这一点?

0 投票
4 回答
149 浏览

haskell - 映射同时显示中间状态

我需要一个执行此操作的函数:

我的真实案例更复杂,但这个例子显示了问题的要点。主要区别在于,实际上使用索引是不可行的。List应该是一个Traversable或。Foldable

编辑:这应该是函数的签名:

更接近我真正想要的是相同的签名,traverse但无法弄清楚我必须使用的功能,以获得所需的结果。

0 投票
1 回答
195 浏览

string - Text.Parser.Char 中的“字符串”实现

首先,只是一些快速的上下文。我正在阅读Haskell Programming From First Principles这本书,并遇到了以下练习。

尝试编写一个解析器,它可以做什么string,但使用char.

我想不通,所以我检查了实现的源代码。我目前正试图绕过它。这里是:

我的问题如下,从最具体到最不具体。

  1. 为什么是show必要的?

  2. 为什么是s <$必要的?工作不traverse char s <?> s一样吗?换句话说,为什么我们要把遍历的结果扔掉呢?

  3. 遍历发生了什么?我得到了列表遍历的作用,所以我想我对 Parser 的 Applicative/Monad 实例感到困惑。在高层次上,我知道遍历 applychar具有 type CharParsing m => Char -> m Char,适用于 string 中的每个字符s,然后将所有结果收集到 typeParser [Char]中。所以类型是有道理的,但我不知道后台发生了什么。

提前致谢!

0 投票
0 回答
183 浏览

javascript - 我的 Javascript 遍历实现中的应用程序在哪里?

我试图理解 Haskell 的traverse功能并在 Javascript 中实现它,但我被卡住了。当我查看它的类型(Functor t, Foldable t, Applicative f) => (a -> f b) -> t a -> f (t b)时,我明白我需要<$>map在 JS 中)、<*>ap在 JS 中)并且fold为了实现它。

我想出了以下代码:

由于我使用了Ident并且Array类型简化为(a -> [b]) -> Ident a -> [Ident b]. traverse在重建数据结构时运行效果。如果我没记错的话,可以在我的示例中观察到列表函子的非确定性影响。

但是应用在哪里?为什么可遍历必须是函子?我的草图不需要它们只是巧合吗?

0 投票
1 回答
265 浏览

haskell - “高阶 Traversable”类应该是什么样的?

这个答案中,我当场编造了一些看起来有点像“高阶Traversable”的东西:就像Traversable但对于从 Hask 到 Hask 的 endofunctors 类别的函子。

我创建了HFunctor一个超类,HTraversable因为它看起来是正确的,但是当我坐下来写作时,hmapDefault我被卡住了。

Identity . eta有一个 type forall y. f y -> Identity (g y),所以当我将它传递给htraverse gunifies withIdentity并且x必须与两者统一时yg y它会失败,因为遍历函数不是自然转换。

我尝试使用以下方法对其进行修补Compose

现在Compose . Identity . eta是一个自然的转变,但你不能htraverse接受它,因为你不知道Applicative g。即使你能做到这一点,runIdentity调用也会返回g (t Identity),你将无法将gback 放入t.


然后我意识到 myhtraverse并不是真的类似于普通的 old traverse。的遍历函数traverse将新值放入Applicative效果中,使类型表达式更大。所以htraverse应该看起来像这样:

很有希望这个定义看起来更像Traversable,并且hmapDefault顺利进行,

但我正在努力为sequenceA. 我试过了

但我想不出一种实现htraverse方式hsequence。和以前一样,f不是自然的转变。

我怀疑我的hsequence类型签名错误。问题是Applicative- 我需要一直到索引单子吗?Functor“从类别到 Hask的可遍历函子”的类应该是什么样的?这样的事情还存在吗?

0 投票
1 回答
94 浏览

javascript - 显式类型传递是否不等于类型推断(就表现力而言)?

我尝试将traverse/翻译sequenceA成 Javascript。现在 Haskell 实现的以下行为给我带来了麻烦:

作为一个 Haskell 新手,我想知道为什么第一个表达式完全有效:

pure Nothing在这种情况下不应该工作,因为没有可以放入值的最小应用上下文。似乎编译器懒惰地检查这个表达式的类型,并且由于映射 id 函数Nothing是一个 noop,它只是“忽略”类型错误,可以这么说。

这是我的 Javascript 翻译:

(请注意,由于 Javascirpt 的原型系统不足以支持几个类型类,并且无论如何也没有严格的类型检查,所以我使用 Church 编码并将类型约束显式传递给函数。)

显然,这个翻译偏离了 Haskell 的实现,因为我得到了一个[None]我应该得到一个None. 老实说,这种行为完全符合我的直觉,但我想直觉在函数式编程中并没有那么大的帮助。现在我的问题是

  • 我只是犯了一个菜鸟的错误吗?
  • 还是显式类型传递不等于类型推断(就表现力而言)?