小编Min*_*Liu的帖子

Haskell:为什么Int的性能比Word64差,为什么我的程序远比C慢?

我正在阅读一篇关于Haskell在使用Collat​​z猜想有多缓慢的文章,它基本上表明如果你将三个加一个乘以一个奇数,或者将一个偶数除以一个,你最终会得到一个.例如,3 - > 10 - > 5 - > 16 - > 8 - > 4 - > 2 - > 1.

本文中给出的程序是计算给定范围内最长的Collat​​z序列.C版本是:

#include <stdio.h>

int main(int argc, char **argv) {
   int max_a0 = atoi(argv[1]); 
   int longest = 0, max_len = 0;
   int a0, len;
   unsigned long a;

   for (a0 = 1; a0 <= max_a0; a0++) {
      a = a0;
      len = 0;

      while (a != 1) {
         len++;
         a = ((a%2==0)? a : 3*a+1)/2;
      } …
Run Code Online (Sandbox Code Playgroud)

optimization performance haskell

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

在Haskell中选择AST表示

我目前正在开发一个玩具函数式语言编译器,目的是学习与Haskell中类型相关的东西和稍微先进的技术.

我相信我需要将信息附加到我树上的每个节点,比如原始源代码中的位置,以便更好地报告错误,输入类型,生成类型约束等等.所以最初我选择了这个方法:

data Expr a = ELam [Pat a]  (Expr a) a
            | ELet [Decl a] (Expr a) a
            | EIf  (Expr a) (Expr a) (Expr a) a
            | ECase (Expr a) [Alt a] a
            | EApp (Expr a) [Expr a] a
            | EVar Variable a
            | ECon Variable a
            | ELit Literal  a
            | ELOpSec (Op a) (Expr a) a
            | EROpSec (Op a) (Expr a) a
            | EInfix  (Expr a) (Op a) (Expr a) a
            | ENeg    (Expr …
Run Code Online (Sandbox Code Playgroud)

haskell type-systems abstract-syntax-tree

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

如何优雅地在 Swift 中实现 EventEmitter

我正在编写一个hiredis到 Swift的绑定并处理异步 API 部分。

我想在 Node.js 中有类似于 EventEmitter 的东西。

objectToBeListened.on('event', (data) => { ... }) objectToBeListened.emit('event')

也就是说,我希望我拥有的每门课只有一个“开”和一个“发射”功能。

我目前enum用于所有事件类型和switch“开启”功能。struct引入了一个存储所有回调函数的额外功能。

我无法实现通用的“emit”函数:我只是瞥了一眼 Swift 的泛型部分。但有可能吗?Swift 似乎没有可变参数模板。

无论如何,我的原型代码真的很丑,很难维护。有没有更好的方法来优雅地实现 EventEmitter?

class EEProto {
    var A: Int
    var B: Double

    typealias EventChangeA = (Int, Int) -> Void
    typealias EventChangeB = (Double, Double) -> Void
    typealias EventChanged = () -> Void

    struct RegisteredEvent {
        var eventChangeA: EventChangeA[]
        var eventChangeB: EventChangeB[]
        var eventChanged: EventChanged[]
    }

    enum EventType {
        case changeA(EventChangeA[])
        case …
Run Code Online (Sandbox Code Playgroud)

node.js swift

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