问题标签 [lifting]
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 - Scala 从 List[A] 提升到 List[Option[A]]
在 scala 中,我如何创建一个通用函数来执行以下操作:
f: List[A] ==> List[Option[A]]
scala - Scala:在这种情况下 _ 代表什么
我正在阅读有关 Scala 中提升方法的演示教程。这是基本类的代码:
下面是提升方法:
我的问题是:下划线(“_”)在上述函数中代表什么。
谢谢
haskell - 在 Haskell monad / left-lifting 中使用纯函数?
考虑以下函数:
为了更好的可读性和逻辑性,我想将我的纯函数移动(*2)
到(+1)
返回的左侧。我可以这样实现:
但是,我不喜欢(<.)
.
让我们介绍一个函数leftLift
:
我很喜欢这个。另一种可能性是定义 的变体bind
:
我不确定这是否是一个好主意,因为如果我想要的话,它不允许我使用do
符号。leftLift
我可以使用do
:
我没有在 Hoogle 上找到签名为leftLift
. 这样的函数是否存在,如果存在,它叫什么?如果不是,我应该怎么称呼它?做我想做的事情最惯用的方式是什么?
编辑:以下是受@dunlop 回答启发的版本:
我还应该补充一点,我在使用bind
-variant,因为我想以无点风格编写我的代码。对于do
-notation,我想我不需要“假装”我正在做任何单子的事情,所以我可以使用let
s。
haskell - 在 monad 实例声明中使用 monad 超类?
我正在使用以下数据类型实现一个非常简单的穷人并发结构:
我为此创建了一个 monad 实例:
Q1。我是否正确地说Atomic $ (liftM (>>= f) m)
正在创建一个新的Atomic
monad,其中包含f
( * -> *
) 的结果应用于 内部的值m
?
Q2。我是否说在Monad m
这里使用超类来启用liftM
? 如果是这样,因为这是Monad
类的一个实例,为什么不能liftM
直接访问?
haskell - 应用 fmap 转换时,仿函数是否总是在 haskell 中返回提升的类型?
假设我有一个Int
并且我fmap
使用作为函子应用转换Maybe
,我得到一个包装类型,即Maybe Int
. 那么我可以认为这是提升吗?如果是这样,仿函数是否总是返回提升的类型?
haskell - ghci 中的 liftM:为什么会有这样的差异?
当我在 ghci 中定义这样的函数时:
他们运作良好:
但是当我在文件(probl.hs)中定义相同的函数时:
然后通过 ghci 运行这个文件:
我收到这样的消息:
为什么会有这样的区别?以及如何解决第二种情况的问题(我想要与第一种情况相同的行为)?
functional-programming - 提升和高阶函数之间的区别
当人们谈论 , 或 时,我通常会听到提升这个词map
,fold
但bind
基本上每个高阶函数不都是某种提升吗?
为什么不能filter
从a -> Bool
to提升[a] -> [a]
,甚至bool
函数(模拟 if 语句)也可以被认为是从a -> a
to提升Bool -> a
。如果不是,那么为什么ap
Applicative 类型的类被认为是电梯?
如果重要的是从... a ...
to ... f a ...
,那么ap
也不适合这种情况:f (a -> b) -> f a -> f b
scala - 函数式编程中的“提升”是否遵循严格的规则?
我已经研究过“提升”q/a 的例子,在我看来提升函数就像任何改变形状的转换函数(如单子转换)。
我是否遗漏了任何点或提升功能(“提升概念”)是否有任何规则?
如果不是,它只是功能转换中的概念吗?
haskell - monad 变压器何时需要提升?
我正在学习单子变换器,我对何时需要使用电梯感到困惑。假设我有以下代码(它没有做任何有趣的事情,只是我可以用来演示的最简单的代码)。
所以有一个单子堆栈,其中主要的 do 块有类型ContT Int (StateT Int Identity) Int
。
现在,在第三个when
带递归的 do 块中,程序编译需要一个提升。在第二个街区,不需要电梯,但我不知何故认为这是因为它的存在以exit
某种方式迫使线上方的线被提升到ContT
. 但在第一个街区,不需要电梯。(但如果明确添加,也没有问题。)这真的让我很困惑。我觉得所有的when
do 块都是等效的,无论在任何地方都应该需要电梯。但这显然不是真的。需要/不需要电梯的关键区别在哪里?
haskell - 如何将 fold|map|both 提升到 Either monad 中?
类型的“地图”
将是一个开始。(Hayo 没有找到。)或者类型的“折叠”
最重要的是(就我而言)是这样的:
这可能就是您需要阅读的全部内容。但是,如果您需要更多详细信息,这里有一个具体示例:
想象一个树状结构来 mapAccum 。每个分支在评估其子代后,都会被其子代和累加器的某些功能所转换。
下面是一些工作代码,将每棵树的值添加到累加器中,并将其子标签的乘积添加到每个分支的标签中:
这是返回的内容:
但是,如果我们在 foldl 中使用 evenMult 而不是使用 (*) 会怎样?