我想通过Haskell FFI在C++中实现一个函数,它应该具有(最终)类型 String -> String.比如说,是否可以在C++中使用完全相同的签名重新实现以下函数?
import Data.Char
toUppers:: String -> String
toUppers s = map toUpper s
Run Code Online (Sandbox Code Playgroud)
特别是,我想避免在返回类型中使用IO,因为在这个简单的任务中引入杂质(我的意思是IO monad)在逻辑上是不必要的.到目前为止我所看到的所有涉及C字符串的例子都涉及返回IO某事或Ptr,它们无法转换回纯粹的String.
我之所以这样做,是因为我觉得封送会对FFI造成混乱.也许如果我能解决上面最简单的情况(除了原始类型,如int),那么我可以在C++端做任何我想要的数据解析,这应该很容易.
与我想要在编组到/从字符串之间进行的计算相比,解析的成本可以忽略不计.
提前致谢.
我想知道是否有办法重复一个bash命令,其子命令用空格分隔.例如,如果我输入几个命令,
git add a.txt
git status
... other commands starting with git
git commit -m ""
Run Code Online (Sandbox Code Playgroud)
并做:
!混帐
我将git commit再次运行最后一个命令.我的问题是,有没有办法重复包含空格的最后一个git status命令,例如重复最后一个命令?
我试过了,
!git\ s
!"git s"
Run Code Online (Sandbox Code Playgroud)
,但都没有用.
我试图lambdabot用ghc-7.8.2 安装,但在安装时遇到错误haskell-src-exts.为了诊断这个问题,我试过了
cabal install haskell-src-exts -v3
Run Code Online (Sandbox Code Playgroud)
并得到以下错误.我使用的是Windows XP 64位.我不知道这是否与windows目录名中的空格有关.任何想法/指针如何解决问题?
...
[_18] next goal: array (dependency of haskell-src-exts-1.15.0.1)
[_18] trying: array-0.5.0.0/installed-d6d...
[_19] done
Ready to install haskell-src-exts-1.15.0.1
Extracting C:\Documents and Settings\ting\Application
Waiting for install task to finish...
Data\cabal\packages\hackage.haskell.org\haskell-src-exts\1.15.0.1\haskell-src-exts-1.15.0.1.tar.gz
to C:\DOCUME~1\ting\LOCALS~1\Temp\haskell-src-exts-1.15.0.1-3008...
Renaming
'C:\DOCUME~1\ting\LOCALS~1\Temp\haskell-src-exts-1.15.0.1-3008\haskell-src-exts-1.15.0.1\dist'
to
'C:\DOCUME~1\ting\LOCALS~1\Temp\haskell-src-exts-1.15.0.1-3008\haskell-src-exts-1.15.0.1\dist-tmp'.
creating
C:\DOCUME~1\ting\LOCALS~1\Temp\haskell-src-exts-1.15.0.1-3008\haskell-src-exts-1.15.0.1\dist
Renaming
'C:\DOCUME~1\ting\LOCALS~1\Temp\haskell-src-exts-1.15.0.1-3008\haskell-src-exts-1.15.0.1\dist-tmp'
to
'C:\DOCUME~1\ting\LOCALS~1\Temp\haskell-src-exts-1.15.0.1-3008\haskell-src-exts-1.15.0.1\dist'.
Failed to install haskell-src-exts-1.15.0.1
Last 10 lines of the build log ( C:\Documents and Settings\ting\Application Data\cabal\logs\haskell-src-exts-1.15.0.1.log ):
cabal.exe: C:\Documents and Settings\ting\Application
Data\cabal\logs\haskell-src-exts-1.15.0.1.log: does not exist
Run Code Online (Sandbox Code Playgroud) 我正在使用以下代码测试通用引用,
template <typename T>
vector<T> attach_(vector<T> xs, T&& x) {
xs.push_back(std::forward<T>(x));
return xs;
}
int main() {
int k = 2;
attach_(std::move(vector<int>{1,2,3}),k); //not OK
attach_(std::move(vector<int>{1,2,3}),(int&)k); //not OK
attach_(std::move(vector<int>{1,2,3}),(int)k); //OK
attach_(std::move(vector<int>{1,2,3}),2); //OK
}
Run Code Online (Sandbox Code Playgroud)
并得到一个错误:
no matching function for call to 'attach_(std::remove_reference<std::vector<int> >::type, int&)'
attach_(std::move(vector<int>{1,2,3}),k);
note: template argument deduction/substitution failed:
note: deduced conflicting types for parameter 'T' ('int' and 'int&')
attach_(std::move(vector<int>{1,2,3}),k);
Run Code Online (Sandbox Code Playgroud)
SO有类似错误的问题错误消息"推断参数'const T'的冲突类型"关于const引用.
我还测试了一些其他案例,其中一些案例有类型转换.一些工作和其他工作没有.
我听说通用引用就像T&&匹配一切.为什么在这里失败?
第二个问题是,如何键入attach_以确保移动语义既适用于适当的输入xs又x适用于适当的输入?最后,我想要有以下变体:
for(int i = 0; i < …Run Code Online (Sandbox Code Playgroud) 我正在测试在emacs中加载包init.el(Emacs 24.3).我按照作者的博客emacs prelude自动加载包,并将代码复制到我init.el的底部.但是,我收到有关loop函数/符号的错误消息,其中说:
Symbol's function definition is void: loop
Run Code Online (Sandbox Code Playgroud)
有人可以解释如何修复代码吗?
我在互联网上搜索过,似乎这loop是一个宏cl-lib.我的猜测是loop缺少定义,我试图通过添加修复问题(require 'cl-lib),如代码所示,但错误仍然存在.关于类似的错误消息还有其他SO问题,例如:ELisp:"符号的值作为变量的空白"的cl循环,符号的函数定义是void:declare-function.但错误消息在缺少的内容上有所不同,答案主要是建议替代路由,例如使用较新版本的emacs.
- 代码 -
(require 'package)
(add-to-list 'package-archives
'("melpa-stable" . "http://stable.melpa.org/packages/") t)
(package-initialize)
;;; check & load packages
(defvar prelude-packages
'( haskell-mode )
"A list of packages to ensure are installed at launch.")
;;(require 'cl-lib) ;debug
(defun prelude-packages-installed-p ()
(loop for p in prelude-packages
when (not (package-installed-p p)) …Run Code Online (Sandbox Code Playgroud) 对于具有三个或更多参数的函数,如何currying工作?
我搜索了SO和Google。例如,什么是“固化”中给出的具体示例?; https://en.wikipedia.org/wiki/Currying有关二进制函数f (x, y)。
在这种情况下, g = curry f采用一个参数并产生一元函数(f x)。
我的问题是:
我们如何将其一致地扩展到n参数函数,例如f3 (x,y,z)?(f3:X-> Y-> Z-> U)
如果将curry操作视为高阶函数,则它不能直接应用于f3,因为curry期望使用type函数(X,Y) -> Z,并且的参数f3是三元组,而不是对。带有fnn元组的函数也会出现相同的问题。
一种解决方案可能是等于(x,y,z)和(x,(y,z)),然后curry似乎适用。然后curry f3 = (f3 x)是类型(Y,Z) -> U。但这应该是咖喱吗?
从Coq参考手册(8.5p1)中,我的印象revert是的倒数intro,但generalize在一定程度上也是这样。例如,revert和generalize dependent下面似乎是相同的。
Goal forall x y: nat, 1 + x = 2 + y -> 1 + x + 5 = 7 + y.
intros x y. revert x y.
intros x y. generalize dependent y. generalize dependent x.
Run Code Online (Sandbox Code Playgroud)
仅仅generalize是比它更强大revert吗?
另外,该文档在解释有关以下内容方面有点循环generalize:
此策略适用于任何目标。它概括了有关某个术语的结论。
是generalize类似于演算抽象操作?
我对默认参数有点生疏,我想知道如果参数没有默认参数,我怎么能使用参数的默认值?
在从Redux.js例下面,默认值时将{}用于state参数是有用的?(因为你不能默认下一个参数)?
const todo = (state = {}, action) => {
switch (action.type) {
//...
case 'TOGGLE_TODO':
if (state.id !== action.id) {
return state
}
return Object.assign({}, state, {
completed: !state.completed
})
default:
return state
}
}
Run Code Online (Sandbox Code Playgroud) 我想编写一个fold函数std::tuple来计算例如给定元组中所有元素的总和(或乘积).例如,给定
std::tuple<int,double> t = std::make_tuple(1,2);
Run Code Online (Sandbox Code Playgroud)
我想算一下
auto s = sumT(t); //giving 3
Run Code Online (Sandbox Code Playgroud)
我试过但是无法在下面编译我的模板编程(c ++ 11/1z)代码.我也试着去适应接受的答案对我的其他问题(如何执行用C元组算术++(C++ 11/C++ 17)? ),但无法弄清楚如何使用std::index_sequence在这种情况下.
我遇到的问题是:
1)我无法弄清楚类型,例如如何使用第一个元素的类型作为返回类型.目前,我_res在模板中使用了一个类型,但我不知道是否会阻止c ++的自动类型推理.
2)我想在不使用显式初始元素的情况下对其进行编程0,以便可以将其用于其他类型的fold操作.
目前,递归在最后一个元素处结束.我想结束递归,_size - 1以便我可以直接对最后一个元素执行操作而不需要求助0.
我下面的代码试图通过递归来做到这一点.但我不熟悉模板编程,以及循环如何为元组工作.
有人可以帮助修复代码或提出更好的解决方案吗?
到目前为止我的代码是:
#include <tuple>
#include <iostream>
#include <functional>
// helper class for fold operations
template<typename Op,typename _res, typename _Tp, size_t _i, size_t _size>
struct _tuple_fold {
static constexpr _res _op(Op const & op, const _Tp& _t) { …Run Code Online (Sandbox Code Playgroud)