是否可以在Haskell中编写Y Combinator?
看起来它会有一个无限递归的类型.
Y :: f -> b -> c
where f :: (f -> b -> c)
Run Code Online (Sandbox Code Playgroud)
或者其他的东西.甚至是一个简单的因子因素
factMaker _ 0 = 1
factMaker fn n = n * ((fn fn) (n -1)
{- to be called as
(factMaker factMaker) 5
-}
Run Code Online (Sandbox Code Playgroud)
失败的"发生检查:无法构造无限类型:t = t - > t2 - > t1"
(Y组合器看起来像这样
(define Y
(lambda (X)
((lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg))))
(lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg)))))))
Run Code Online (Sandbox Code Playgroud)
在计划中)或者,更简洁
(? (f) ((? (x) …Run Code Online (Sandbox Code Playgroud) 我想将函数映射到哈希表中的值,如下所示:
(hash-map add1 (hash "apple" 1 "pear" 2))
=> #hash(("apple" . 2) ("pear" . 3))
Run Code Online (Sandbox Code Playgroud)
是否有库函数来执行此操作?有一个人也可以使用不可变的hashetables.
我看着PlaneT,但没有看到任何东西.
现在,如果这确实不存在,我会继续写下来.把这个变成球拍的礼节是什么?我只是将它分叉在github上并将其添加到标准库(和文档!)并提交拉取请求?或者我应该先把它作为一个飞机,然后要求它被移入?我想帮忙,但我不知道什么是'正确'的方式去做.
所以,我试图看看可以接受任意数量的参数的函数是如何工作的?
我试过这个
(define (plus x . xs)
(if
(null? xs) x
(plus (+ x (car xs)) . (cdr xs))))
(plus 1 2 3 4)
Run Code Online (Sandbox Code Playgroud)
但似乎它实际上并没有将cdr应用于xs,而是在调试器中通过它时传递((2 3 4)).所以我尝试了这个
(define (plus* x . xs)
(if
(null? xs) x
(let ((h (car xs))
(t (crd xs)))
(plus* (+ x h) . t))))
Run Code Online (Sandbox Code Playgroud)
思考:"哈,我想看到你现在通过cdr",但我得到一个错误:"应用程序:错误的语法(非法使用`.')in :(加*(+ xh).t)"
到底是怎么回事?
(我可以通过以下方式获得加入工作的版本
(define (add . xs)
(foldl + 0 xs))
Run Code Online (Sandbox Code Playgroud)
甚至
(define (plus x . xs)
(if
(null? xs) x
(apply plus (cons (+ x (car xs)) (cdr …Run Code Online (Sandbox Code Playgroud) 我想在Racket中以二进制打印填充到32位字.我知道printf和"~b",但我希望它每次填充为32位长.我该怎么做呢?
例
(printf "~b" 42)
=> 101010
Want: 00000000000000000000000000101010
Run Code Online (Sandbox Code Playgroud) 我使用vector的length和value构造函数创建了一个名为xor_funcs的bitpacked向量的向量.这是失败的测试:
TEST(vectorInit, size3) {
const xor_func temp{false, {0,0,0}};
vector<xor_func> arr{3, temp};
for(xor_func& f : arr) {
EXPECT_EQ(3, f.size()) << f;
}
for(int i = 0; i < 3; i++) {
ASSERT_EQ(3, arr[i].size()) << "for i=" << i;
arr[i].set(i);
}
}
Run Code Online (Sandbox Code Playgroud)
似乎size()调用正在访问未初始化的内存,对于长度为3或更长的向量,而不是大小为2的向量.Valgrind确认内存最近没有堆栈,malloc'd或free'd.
在xor_func被定义为这样的:
class xor_func {
private:
boost::dynamic_bitset<> bitset;
bool negated;
public:
xor_func(const bool neg, const std::initializer_list<int> lst);
// That's defined in cpp
xor_func(const size_t size) : bitset(size), negated(false) {}
// Disallow the trivial constructor, since I …Run Code Online (Sandbox Code Playgroud) 有一个更好的方法吗:
perms = product(range(1,7),range(1,7),range(1,7))
Run Code Online (Sandbox Code Playgroud)
这样我可以选择使用多少量程?我希望它等同于此,但可扩展.
def dice(num)
if num == 1:
perms = ((i,) for i in range(1,7))
elif num == 2:
perms = product(range(1,7),range(1,7))
elif num == 3:
perms = product(range(1,7),range(1,7),range(1,7))
#... and so on
Run Code Online (Sandbox Code Playgroud)
但我知道必须有更好的方法.我用它来计算骰子结果.实际的代码
def dice(selection= lambda d: d[2]):
perms = itertools.product(range(1,7),range(1,7),range(1,7))
return collections.Counter(((selection(sorted(i)) for i in perms)))
Run Code Online (Sandbox Code Playgroud)
我可以用各种各样的选择器来调用它,例如sum(d[0:2])最低2个骰子的总和或者d[1]获得中间骰子.