问题标签 [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.

0 投票
1 回答
232 浏览

rust - 提升功能到选项

有没有办法解除一个简单的功能,像这样

操作Option(或任何其他单子类型),类似于ApplicativeHaskell

我知道这个解决方案:

但这需要我实际编写一个单独的函数,该Option函数与一元类型的参数和返回值

我显然在想Haskell,也许有更惯用的方式来做到这一点Rust

0 投票
1 回答
72 浏览

haskell - 将具有“MonadIO”类型变量的类实例提升到转换后的 monad

作为我需要从一元计算记录数据的程序的一部分,我正在尝试定义一个类以使其更方便。

我想做的一件事是在“更高”的 monad 中定义get和,因为某些数据在. 对于更简单的数据,例如 的实例,就足够了。我想将基本实例保留在“最低”可能的单子中,但允许将操作提升到任何“更高”实例。putIOStorableIOMonadIO

这个想法是启用功能,如

其中 in 中的实例IO可以与 any 中的实例组合MonadIO。但是,使用我当前的代码,GHC 无法推断Serial m Int32. 对于解除IO此问题的特定情况,可以通过 解决liftIO,但如果基本类型t IO不再起作用。我认为这可以通过重叠实例来解决,但如果可能的话,我想避免这种情况。有什么办法可以做到这一点?

0 投票
1 回答
66 浏览

c++ - 以函数方式组合谓词

Boost Hana 是否提供了一种将谓词与逻辑运算符结合起来的方法?

我指的是大致这样的东西

可以这样使用:

在哪里,从 Hana 那里,我还希望有一种方法以类似于 , 的中缀方式使用它hana::onboth(less_than_7, more_than_3) === less_than_7 ^both^ more_than_3尽管and会更好,但我刚刚发现它是 的同义词&&)。

或者它是否提供了一种提升标准运算符&&以对函数函子进行操作的方法?

0 投票
1 回答
108 浏览

functional-programming - 如何将ado符号重写为一般的应用程序提升,尊重评估顺序?

applicative do notation / adovs. applicative lift via <$>/ mapon the first argument 和<*>/apply对于其余论点的评估顺序似乎有所不同。

至少,这是到目前为止所读到的内容,并且反映在下面所示的练习过程中。问题:

  1. 为什么解决方案1和2的评估顺序不同(一般概念)?
  2. 如何重写解决方案 2(没有 ado),尊重测试中的预购断言?

给定

PureScript by Example 书(第 7 章)中的练习可以在这里找到:

3.(中)编写一个traversePreOrder :: forall a m b. Applicative m => (a -> m b) -> Tree a -> m (Tree b)执行树的前序遍历的函数。[...] Applicative do notation (ado) 是编写此函数的最简单方法。

代数数据类型Tree

测试期望遍历顺序[1,2,3,4,5,6,7]

注意:我不确定,具体是做什么tellrunWriter- 这是从练习中复制的代码块。

为了说明 - 示例树如下所示:

在此处输入图像描述

我试过的

解决方案1:(ado有效)

解决方案2:常规吊装(不起作用)

这会触发错误:

预期 [1,2,3,4,5,6,7],得到 [3,2,4,1,6,5,7]

0 投票
1 回答
157 浏览

haskell - Haskell Monads 和 liftIO 我不明白

您好社区感谢您的时间。

我有一个错误,我不确定错误是什么,但我认为问题是:从ext-1.2.4.1:Data.Text.Internal.Lazy.Text IO)to没有 IO 转换器Web.Scotty.Internal.Types.ScottyT

但我想知道为什么编译器与ext-1.2.4.1:Data.Text.Internal.Lazy.Text IO). 这就是为什么我只使用 String 并且我删除了所有出现{-# LANGUAGE OverloadedStrings #-}但仍然得到错误的原因。另一方面,这应该是IO [String],不是吗?正如你可以提到的,我真的不知道是什么ext-1.2.4.1:Data.Text.Internal.Lazy.Text IO)

在另一个地方,我已经liftIO成功地使用了一个a -> IO String功能。我想我以同样的方式使用它们。

我想我慢慢地对什么是单子有了感觉,但不太确定。我真的不知道为什么我必须使用一个lift函数。

错误信息:

发生错误的地方:

0 投票
1 回答
54 浏览

c++ - 将 armv7m 指令翻译成 llvm IR

我正在构建一个从 armv7m 指令提升到 llvm IR 的升降机。所以我试图将所有 armv7m 指令转换为它们等效的 llvm 指令。我是 llvm 的新手,我想创建和打印一个 llvm 指令。所以从一个简单的添加指令开始,我的代码是:

我想要的输出是

我得到的输出是

第一点,请问如何在不被评估的情况下显示指令?

第二点。正如你在上面的代码中看到的

我正在为我的 add 指令创建两个常量 int 作为操作数,现在如何为 add 指令创建一个不是 int 的操作数 ..just 一个变量。你可能会说一个占位符。例如这里的 x 和 y 变量。

0 投票
1 回答
103 浏览

assembly - 将 armv7m 指令翻译成 LLVM IR

我正在用 c++ 开发一个提升器,将 armv7m 指令提升到 LLVM IR 中。

现在我处于翻译阶段,我只需输入一条手臂指令并将其翻译成等效的 SSA LLVM IR 指令。

我的架构只是为我的汇编代码中的每个函数创建一个 llvm 函数,并为函数内的每个基本块创建一个 llvm 基本块,对于基本块内的每个汇编指令,我使用构建器为该指令构建等效的 llvm IR 指令(同时将该指令的基本块的 llvm 基本块传递给 IRBuilder)..我的 ADD 汇编指令代码示例。

基本上,我正在尝试为示例add r1, r3, #2汇编指令生成 llvm IR 指令。

我想在生成的等效 llvm ir 指令(即 %r1、%r3)中使用汇编指令(r1、r3)中使用的寄存器的名称。但是,在生成的 IR 中的许多情况下,在此示例中,我将附加索引添加到寄存器名称中作为 %r346(在“%r3”之后添加了“46”)。为什么要添加这些索引,请问有没有办法删除它们。

例如add r1, r3, #2汇编指令。我想要的输出是:

%12 = alloca i32,对齐 4

存储 i32 0,i32* %12,对齐 4

%r3 = 加载 i32,i32* %12,对齐 4

%r1 = 添加 i32 %r3, 2

虽然我得到的输出是:

%12 = alloca i32,对齐 4

存储 i32 0,i32* %12,对齐 4

%r346 = 加载 i32,i32* %12,对齐 4

%r1 = 添加 i32 %r346, 2

我可以在这里像 %1 这样的 llvm 函数中更新变量吗?

%1 = 多重 i32 %x, %y

%1 = 添加 i32 %1, %z

当我测试我的升降机 id 时,我喜欢跟随一个特定的寄存器(r3),因为它在一个函数中通过不同的汇编指令进行。这些额外的索引会增加混乱。对于以下汇编代码 id,例如为每个汇编指令生成的 llvm IR,使其具有 %r3 而没有任何附加索引。

0 投票
0 回答
49 浏览

c++ - 如何获取存储在 llvm 指针指向的内存中的数据

我正在构建一个将 armv7m 汇编指令转换为 llvm IR 的升降器。我的 C++ 代码示例是:

IRBuilder<> builder(TheContext); //第0行

llvm::ConstantInt* I_0 = llvm::ConstantInt::get(TheContext, llvm::APInt(/ nbits /32, 0, true)); //第 1 行

V = builder.CreateAlloca(Type::getInt32Ty(TheContext), nullptr, "V"); //第 2 行

值* s3 = builder.CreateStore(I_0, V, / isVolatile= /false); //第 3 行

Value* loaded_V = builder.CreateLoad(V); //第 4 行

值* result_V = builder.CreateICmpEQ(I_0, loaded_V); //第 5 行

结果_V->打印(错误());//第 6 行

我得到的结果是:

我想要的结果是:

所以我的问题是,即使我在第 3 行中的 ptr V 指向的内存位置存储了一个即时值 0。当我使用第 4 行中的 ptr V 的内存加载从内存中加载这个值然后将其与第 5 行的 icmpEq 中的立即值为 0,为什么我在第 6 行中没有得到一个真实的结果,但似乎loaded_V 没有计算为立即值 0,它只是由变量 %18 表示。

1-如何获取存储在 llvm 变量 %18 中的值?

2-有没有办法直接获取存储在ptr V指向的内存地址中的数据而无需加载。

正如您在我的代码的另一个示例中看到的那样,我试图将汇编指令 add DST, SRC1, SRC2转换为等效的 llvm IR:

我使用 alloca 指令将操作数表示为内存地址的 ptr,然后在 llvm 指令创建中使用操作数时从该内存地址加载。

3-是否有更好的方法来表示操作数(虚拟寄存器?!,而不是 ptrs 到内存)。

0 投票
1 回答
99 浏览

c++ - 获取存储在 LLVM 变量中的数据

我正在构建一个将汇编代码转换为 LLVM IR 的升降器。我想知道是否有可能的方法来检查存储在 LLVM 变量中的数据。例如在我下面的代码中。我正在创建一个虚拟 LLVM 函数。在我的函数内部,我只有一个基本块,我在其中为单个变量 SRC 分配内存,然后在分配的内存中存储立即值 31。最后一步是我从该内存加载到一个名为loaded 的变量中。有没有办法检查 %loaded 变量的值实际上是 31 吗?

我的代码输出如下所示:

0 投票
0 回答
159 浏览

assembly - 将混淆的堆栈机器提升到 LLVM IR

我正在研究一个名为 VMProtect 的代码虚拟化解决方案,它创建一个带有虚拟指令集的自定义堆栈机器来混淆代码。我想做的是将每个虚拟机指令处理程序(其中大部分由基于堆栈的操作组成)提升到 LLVM IR,然后应用优化并重新编译。

我将为此使用 llvm 的 IRBuilder。

我的一些问题是:

  1. 如何在 IR 中表示 push/pop
  2. 像这样的处理程序在 IR 中会是什么样子