小编The*_*ire的帖子

Haskell中的Y Combinator

是否可以在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)

haskell y-combinator

47
推荐指数
4
解决办法
1万
查看次数

如何映射哈希表(球拍)的值

我想将函数映射到哈希表中的值,如下所示:

(hash-map add1 (hash "apple" 1 "pear" 2))
=> #hash(("apple" . 2) ("pear" . 3))
Run Code Online (Sandbox Code Playgroud)

是否有库函数来执行此操作?有一个人也可以使用不可变的hashetables.

我看着PlaneT,但没有看到任何东西.

现在,如果这确实不存在,我会继续写下来.把这个变成球拍的礼节是什么?我只是将它分叉在github上并将其添加到标准库(和文档!)并提交拉取请求?或者我应该先把它作为一个飞机,然后要求它被移入?我想帮忙,但我不知道什么是'正确'的方式去做.

scheme hashtable racket

7
推荐指数
2
解决办法
6180
查看次数

方案中的可选参数和点

所以,我试图看看可以接受任意数量的参数的函数是如何工作的?

我试过这个

(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)

scheme optional-parameters racket

6
推荐指数
1
解决办法
4934
查看次数

在Racket中打印填充的二进制字

我想在Racket中以二进制打印填充到32位字.我知道printf和"~b",但我希望它每次填充为32位长.我该怎么做呢?

(printf "~b" 42) 
=> 101010
Want: 00000000000000000000000000101010
Run Code Online (Sandbox Code Playgroud)

racket

4
推荐指数
1
解决办法
793
查看次数

使用已定义结构的向量到达未初始化的内存

我使用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)

c++ c++11

2
推荐指数
1
解决办法
167
查看次数

Python中的多范围产品

有一个更好的方法吗:

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]获得中间骰子.

python generator permutation range

1
推荐指数
1
解决办法
1481
查看次数