问题标签 [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.
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
:
我错过了什么?
haskell - 为什么 Data.Traversable 中的“for”接受单子操作?
我正在研究以下一小段代码:
当我意识到我可以do
用应用风格重写块时:
并且我也可以forM
用for
. 在进行上述更改之前,我for
首先切换到:
令我惊讶的是,这仍然编译。给定 的定义 for
:
我认为Applicative
约束会阻止我在传递给for
.
我显然在这里遗漏了一些基本的东西,无论是for
签名的真正含义,还是我发布的代码是如何被编译器解释的,如果能帮助理解正在发生的事情,我将不胜感激。
haskell - 理解混乱
我一直在考虑是否可以添加一些方法Traversable
来使其在昂贵的仿函数存在的情况下更便宜地组合。灵感是Control.Lens.Traversal.confusing
,它使用特殊Applicative
来做类似的事情。
不幸的是,confusing
它真的名副其实——我不明白它实际上在做什么。特别是,我对Curried
.
此外,confusing
它具有 CPS 的味道,这表明它可能对我的目的来说太严格了。Yoneda
可以换掉Coyoneda
以增强懒惰,但我不知道如何处理Curried
.
haskell - 用列表压缩可遍历的最标准/通用的方法是什么?
Traversable
从某种意义上说,它的结构具有“路径”(可以对应于列表)的容器类,可以在不分解结构的情况下修改其上的元素。因此
但是,这种列表状态遍历似乎有点骇人听闻,并且可能不是最有效的方法。我想会有一个标准功能可以完成上述或更一般的任务,但我不知道它会是什么。
haskell - 没有中间列表的过滤列表笛卡尔积
我正在尝试从给定的列表列表中创建过滤的笛卡尔积。天真的解决方案如下:
traversable 是否足够强大,可以在不创建中间列表的情况下完成它?有没有一种惯用的方法来做到这一点?
haskell - 映射同时显示中间状态
我需要一个执行此操作的函数:
我的真实案例更复杂,但这个例子显示了问题的要点。主要区别在于,实际上使用索引是不可行的。List
应该是一个Traversable
或。Foldable
编辑:这应该是函数的签名:
更接近我真正想要的是相同的签名,traverse
但无法弄清楚我必须使用的功能,以获得所需的结果。
string - Text.Parser.Char 中的“字符串”实现
首先,只是一些快速的上下文。我正在阅读Haskell Programming From First Principles这本书,并遇到了以下练习。
尝试编写一个解析器,它可以做什么
string
,但使用char
.
我想不通,所以我检查了实现的源代码。我目前正试图绕过它。这里是:
我的问题如下,从最具体到最不具体。
为什么是
show
必要的?为什么是
s <$
必要的?工作不traverse char s <?> s
一样吗?换句话说,为什么我们要把遍历的结果扔掉呢?遍历发生了什么?我得到了列表遍历的作用,所以我想我对 Parser 的 Applicative/Monad 实例感到困惑。在高层次上,我知道遍历 apply
char
具有 typeCharParsing m => Char -> m Char
,适用于 string 中的每个字符s
,然后将所有结果收集到 typeParser [Char]
中。所以类型是有道理的,但我不知道后台发生了什么。
提前致谢!
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
在重建数据结构时运行效果。如果我没记错的话,可以在我的示例中观察到列表函子的非确定性影响。
但是应用在哪里?为什么可遍历必须是函子?我的草图不需要它们只是巧合吗?
haskell - “高阶 Traversable”类应该是什么样的?
在这个答案中,我当场编造了一些看起来有点像“高阶Traversable
”的东西:就像Traversable
但对于从 Hask 到 Hask 的 endofunctors 类别的函子。
我创建了HFunctor
一个超类,HTraversable
因为它看起来是正确的,但是当我坐下来写作时,hmapDefault
我被卡住了。
Identity . eta
有一个 type forall y. f y -> Identity (g y)
,所以当我将它传递给htraverse
g
unifies withIdentity
并且x
必须与两者统一时y
,g y
它会失败,因为遍历函数不是自然转换。
我尝试使用以下方法对其进行修补Compose
:
现在Compose . Identity . eta
是一个自然的转变,但你不能htraverse
接受它,因为你不知道Applicative g
。即使你能做到这一点,runIdentity
调用也会返回g (t Identity)
,你将无法将g
back 放入t
.
然后我意识到 myhtraverse
并不是真的类似于普通的 old traverse
。的遍历函数traverse
将新值放入Applicative
效果中,使类型表达式更大。所以htraverse
应该看起来像这样:
很有希望这个定义看起来更像Traversable
,并且hmapDefault
顺利进行,
但我正在努力为sequenceA
. 我试过了
但我想不出一种实现htraverse
方式hsequence
。和以前一样,f
不是自然的转变。
我怀疑我的hsequence
类型签名错误。问题是Applicative
- 我需要一直到索引单子吗?Functor
“从类别到 Hask的可遍历函子”的类应该是什么样的?这样的事情还存在吗?
javascript - 显式类型传递是否不等于类型推断(就表现力而言)?
我尝试将traverse
/翻译sequenceA
成 Javascript。现在 Haskell 实现的以下行为给我带来了麻烦:
作为一个 Haskell 新手,我想知道为什么第一个表达式完全有效:
pure Nothing
在这种情况下不应该工作,因为没有可以放入值的最小应用上下文。似乎编译器懒惰地检查这个表达式的类型,并且由于映射 id 函数Nothing
是一个 noop,它只是“忽略”类型错误,可以这么说。
这是我的 Javascript 翻译:
(请注意,由于 Javascirpt 的原型系统不足以支持几个类型类,并且无论如何也没有严格的类型检查,所以我使用 Church 编码并将类型约束显式传递给函数。)
显然,这个翻译偏离了 Haskell 的实现,因为我得到了一个[None]
我应该得到一个None
. 老实说,这种行为完全符合我的直觉,但我想直觉在函数式编程中并没有那么大的帮助。现在我的问题是
- 我只是犯了一个菜鸟的错误吗?
- 还是显式类型传递不等于类型推断(就表现力而言)?