- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在编写一个简单的 RPN 计算器的过程中,我有以下类型别名:
type Stack = List[Double]
type Operation = Stack => Option[Stack]
val newStack = operations.foldLeft(Option(stack)) { _ flatMap _ }
stack
值并应用
operations
的列表到那个堆栈。每个操作都可能失败(即产生
Option[Stack]
)所以我用
flatMap
对它们进行排序.对此(在我看来)有点不寻常的是,我正在折叠一个单子(monad)函数列表,而不是折叠一个数据列表。
foldl (>>=) (Just stack) operations
foldl :: (a -> b -> a) -> a -> [b] -> a
(>>=) :: Monad m => m a -> (a -> m b) -> m b
foldl (>>=)
组合器,在制作
foldl
的类型之后和
(>>=)
排队,应该是:
mysteryCombinator :: Monad m => m a -> [a -> m a] -> m a
a -> [a -> m a] -> m a
(即从非单子(monad)值开始),
[a -> m a] -> m a -> m a
(即参数翻转),但也没有运气。所以我的问题是,有人知道我神秘的“折叠绑定(bind)”组合器的标准名称吗?
最佳答案
a -> m a
只是一个 Kleisli 箭头,参数和结果类型都是 a。 Control.Monad.(>=>)组成两个 Kleisli 箭头:
(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c
flip (.)
,但对于 Kleisli 箭头而不是函数。
composeParts :: (Monad m) => [a -> m a] -> a -> m a
composeParts = foldr (>=>) return
mysteryCombinator :: (Monad m) => m a -> [a -> m a] -> m a
mysteryCombinator m fs = m >>= composeParts fs
(>=>)
和
flip (.)
在更深的意义上是相关的,而不仅仅是类比;两个功能箭头,
(->)
,以及包裹 Kleisli 箭头的数据类型,
Kleisli
, 是
Control.Category.Category 的实例.所以如果我们要导入那个模块,我们实际上可以重写
composeParts
作为:
composeParts :: (Category cat) => [cat a a] -> cat a a
composeParts = foldr (>>>) id
(>>>)
(在 Control.Category 中定义)只是一种更好的写作方式,如
flip (.)
.
Endo a
输入包装
a -> a
的标准库并且有一个
Monoid
mempty
的实例是
id
和
mappend
是
(.)
;我们可以将其推广到任何类别:
newtype Endo cat a = Endo { appEndo :: cat a a }
instance (Category cat) => Monoid (Endo cat a) where
mempty = Endo id
mappend (Endo f) (Endo g) = Endo (f . g)
composeParts
作为:
composeParts = appEndo . mconcat . map Endo . reverse
mconcat . reverse
有一些包装。但是,我们可以避免
reverse
,因为实例使用
(.)
而不是
(>>>)
, 通过使用
Dual a
Monoid,它只是将一个幺半群转换为一个翻转的
mappend
:
composeParts :: (Category cat) => [cat a a] -> cat a a
composeParts = appEndo . getDual . mconcat . map (Dual . Endo)
composeParts
在某种意义上是一个“定义明确的模式”:)
关于scala - 在函数列表上折叠 flatMap/bind(也就是命名组合器!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8716668/
我有一个对象Foo,其中包含Bar列表。这些类的描述如下: class Foo { String name; List bars = new ArrayList(); Foo(
根据 Mozilla 开发者网站: flatMap() 方法首先使用映射函数映射每个元素,然后将结果展平到一个新数组中。它与 map 后跟深度为 1 的 flat 相同,但 flatMap 通常非常有
我对无法找到该问题的现有问题感到非常惊讶。这是为什么,鉴于: val p: Int => Option[Int] = Some(_) List(1, 2, 3).flatMap(p) 我得到: :14
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 5 年前。 Improve th
我想知道两种平面映射情况之间是否存在显着差异。 案例 1: someCollection .stream() .map(CollectionElement::getAnotherCol
以下是flatMap的定义取自 scala.util.Success。 final case class Success[+T](value: T) extends Try[T] { def fl
我正在寻找一个函数来展平列表数组。首先,我在 RDD 系统上使用 Apach Spark 函数 flatMap 实现了我的解决方案,但我想在本地执行此操作。但是,我无法找到 的等价物 samples
我想知道是否存在忽略 flatMap 中的结果的函数(在 scala 或 cat 中) .例如。 Some("ignore this").ignoreArgumentFlatMap(Some("res
我正在学习 Scala 并解决了 99 个 Scala 问题。对于以下练习: 展平嵌套列表结构。示例: scala> flatten(List(List(1, 1), 2, List(3, List(
当编译器进入无限循环时,是否有人遇到过使用此类 flatMap 链(或什至更长)的问题。 let what = Future.init { (promise) in promise(.succ
有没有更好的函数方式来写 flatMap ? def flatMap[A,B](list: List[A])(f: A => List[B]): List[B] = list.map(x =>
我试图从两个 中变出笛卡尔积潜在无限然后我通过 limit() 限制的流. 到目前为止,这(大约)是我的策略: @Test void flatMapIsLazy() { Stream.
为什么以下声明对 .map() 有效但不适用于 .flatMap() ? val tupled = input.map(x => (x*2, x*3)) //Compilation error:
我正在寻找可以同时映射和展平 Lists 和 Maybes 的代码。我在 this topic 中发现了这样一个 flatMap 函数: flatMap :: (t -> [a]) -> [t] ->
考虑在某些大小写匹配上编写的 flatMap。例如: list.flatMap( v => v match { case Cond1 => if(something) Some
我无法使用ListKOf平面映射T -> Option。 例如 listOf(1,2,3).k().flatMap { i -> if (i % 2 == 0) Some(i) else None
有人可以解释我如何在RxJava中通过flatMap运算符传递onComplete信号吗? 如果对flatMap运算符进行注释,则可以获取1到10的数字列表,这意味着toList将收到onComple
我正在做一个在线类(class)并误读了一个问题(这就是为什么我认为可以发布这个问题,因为答案与类(class)中的问题无关!)。 data class Trip( val drive
给定作为数据类的二维坐标列表 data class Point(val x: Int, val y:Int) val points: List 和 TornadoFX(Kotlin 中的 JavaFX
这个问题已经有答案了: What is the difference between .stream() and Stream.of? (5 个回答) 已关闭 3 年前。 我有以下代码: List p
我是一名优秀的程序员,十分优秀!