【问题标题】:How to interpret a Traversable type as an Applicative in this function? [duplicate]如何在此函数中将 Traversable 类型解释为 Applicative? [复制]
【发布时间】:2021-04-27 09:24:18
【问题描述】:

我正在尝试使用 haskell 类,我发现(至少有一些)Traversable 数据结构也是Applicative

当您查看Traversable 的定义时,您会发现它可以使用sequenceA 函数来定义:

sequenceA :: (Traversable t, Applicative f) => t (f a) -> f (t a)

并且由于 list 既是 TraversableApplicative,我确实尝试在列表列表中使用 sequenceA:

-- this thing ...
sequenceA [[0, 1], [7, 8, 9]]

-- is evaluated as [[0,7],[0,8],[0,9],[1,7],[1,8],[1,9]]

我得到了 2 个列表的笛卡尔积!

它甚至适用于更多的列表。


这是怎么回事?

这个函数的行为背后的直觉是什么?

【问题讨论】:

  • @danidiaz 不错!对我来说,这看起来像是一个完全直接的完全相同的副本。
  • @DanielWagner 另一个问题的标题信息量较少,因为“const”与实际发生的事情完全无关。
  • @danidiaz 没关系。 StackOverflow 的立场是,导致相同答案的问题是重复的,即使问题本身在表面上看起来不同。

标签: list haskell cartesian-product traversable


【解决方案1】:

列表应用的直觉是非确定性计算。您可以将带有 n 元素的[X] 类型列表视为产生X 的计算,它绝对是@987654323 的n 选择之一@ 包含在该列表中,但其中任何一个都是可能的。

例如,列表['a','e'] 表示可以产生'a' 或可以产生'e' 的计算。列表[-4,4] 可能是询问16 的平方根的结果。列表[] 是一个无法正确产生任何值的非确定性计算! (比如说,询问-16的实数平方根的结果...)

在这种解释中,当我们有一个函数列表fs 和一些值xs 时,列表fs <*> xs 是通过应用fs 中的任何函数可以获得的所有可能结果的列表xs 中的任何参数。同时,列表pure x 是确定性计算,始终只产生一个结果,即x

所以!如果您有一个嵌套列表,那么有多种不同的方式来思考它的含义,包括它是一个非确定性计算的列表,或者它是一个生成列表作为其结果的非确定性计算。 sequenceA 函数在这些表示之间传输您:它采用非确定性计算列表并生成单个非确定性计算,其结果是一个列表。所以:

 [[a,b,c],[d,e],[f,g,h,i]]

您可以将其视为包含三个元素的列表。第一个是abc之间的选择,第二个是de之间的选择,第三个是fg、@987654347之间的选择@ 和 isequenceA 函数将产生一个不确定的列表选择,每个列表的形状都与上面的外部列表相同;也就是说,我们在其中选择的每个列表的长度都是 3。第一个元素将来自 [a,b,c];第二个来自[d,e],第三个来自[f,g,h,i]。如果你想一想所有可能发生的方式,你会发现这正是他们的笛卡尔积!

【讨论】:

  • 这太棒了!但是你能用 do 表示法添加等价物吗,我发现它真的很有用......
  • xs >>= f = concat (map f xs)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 1970-01-01
  • 2019-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多