我正在阅读一篇关于Haskell在使用Collatz猜想时有多缓慢的文章,它基本上表明如果你将三个加一个乘以一个奇数,或者将一个偶数除以一个,你最终会得到一个.例如,3 - > 10 - > 5 - > 16 - > 8 - > 4 - > 2 - > 1.
本文中给出的程序是计算给定范围内最长的Collatz序列.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) 我目前正在开发一个玩具函数式语言编译器,目的是学习与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) 我正在编写一个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)