gpt4 book ai didi

objective-c - Objective C 中的惰性数据类型

转载 作者:太空狗 更新时间:2023-10-30 03:44:19 26 4
gpt4 key购买 nike

在 SML 中,以下内容可用于对惰性编程进行建模,

// Have a datatype to wrap a computation
datatype 'a susp = Susp of (unit -> 'a)
// A function to hold the computation
fun delay(f ) = Susp(f)

我知道可以使用 Blocks 编写闭包,

int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
return num * multiplier;
};

所以我想我可以将它用作函数参数。下一步将是如何使用没有实际参数的函数(unit value,例如在 SML fn () => 中)并创建如上所示的惰性数据类型。

这是可能的还是我应该采用更明显的不同方式?

最终目标是模拟 SML 的暂停计算行为,

let val x = Susp(fn () => horribleComp(345))
in
force(x) + force(x)
end

力(x)在哪里

fun force (Susp(f)) = f ()

最佳答案

很酷的问题!

可以在 Objective-C 中实现一个惰性容器,如下所示(但您可能不应该,见下文):

typedef id (^SuspBlock)(void);

@interface Susp : NSObjecti
- (id)initWithBlock:(SuspBlock)block;
+ (id)withBlock:(SuspBlock)block;
- (id)force;
@end

// -----

@interface Susp ()
@property (nonatomic, copy) SuspBlock _block;
@end

@implementation Susp
@synthesize _block;

- (id)initWithBlock:(SuspBlock)block {
self = [super init];
if (self != nil) {
self._block = block;
}

return self
}

+ (id)withBlock:(SuspBlock)block {
return [[[self alloc] initWithBlock:bloc] autorelease];
}

- (id)force {
return self._block();
}

- (void)dealloc {
self._block = nil;
[super dealloc];
}

@end

这是很多样板文件,但无论如何。然后,您可以像这样使用它:

id x = [Susp withBlock:^{ return someComputation(); }];
id result = [[x force] plus:[x force]];
// assuming the result of your computation has -plus:

但这一切都相当愚蠢,因为对于您正在做的事情,您真的不需要另一种数据类型。只需使用 block 作为您的数据类型:

typedef id (^SuspVal)(void);
SuspVal x = ^{ return complicatedThing; };
id result = [x() plus:x()];

这是一种更加紧凑、惯用的处理方式,这也是我的建议。除非您需要向惰性对象添加超出 block 的基本实用程序的更多语义,否则您不应该不必要地包装它们。

干杯!

关于objective-c - Objective C 中的惰性数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5940836/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com