gpt4 book ai didi

objective-c - 在 ReactiveCocoa 中编写 Haskell 的突破

转载 作者:搜寻专家 更新时间:2023-10-30 20:18:52 25 4
gpt4 key购买 nike

我需要一个类似于 Haskell 的 break 的 ReactiveCocoa 函数:

break                   :: (a -> Bool) -> [a] -> ([a],[a])
break _ xs@[] = (xs, xs)
break p xs@(x:xs')
| p x = ([],xs)
| otherwise = let (ys,zs) = break p xs' in (x:ys,zs)

基本上返回一个元组,其第一个组成部分是所有 匹配的项以及在第一个匹配项之前 的项。第二个组成部分是匹配的项目和列表的尾部(无论它们是否匹配)。

直接翻译成ReactiveCocoa是

- (RACTuple *)breakSequence:(RACSequence *)seq withBlock:(BOOL(^)(NSString *))matchBlock
{
id head = [seq head];
if (matchBlock(head)) {
return [RACTuple tupleWithObjects:[RACSequence empty], seq, nil];
} else {
RACTuple *t = [self breakSequence:[seq tail] withBlock:matchBlock];
return [RACTuple tupleWithObjects:[RACSequence sequenceWithHeadBlock:^id{
return head;
} tailBlock:^RACSequence *{
return [t first];
}], [t second], nil];
}
}

显然它可以工作,但由于 breakSequence:seq withBlock: 的递归而遭受堆栈溢出。

在 ReactiveCocoa 中实现这个功能的最佳方式是什么?

谢谢:-)

最佳答案

我的另一个版本看起来有点难看但可以使用,在下面发布。将使用@Justin Spahr-Summers 建议的内容。

- (RACTuple *)betterBreakSequence:(RACSequence *)seq withBlock:(BOOL(^)(NSString *))matchBlock
{
RACSequence *left = [seq takeUntilBlock:matchBlock];
NSNumber *count = [left foldLeftWithStart:@0 reduce:^id(NSNumber *accumulator, id value) {
return [NSNumber numberWithInteger:[accumulator integerValue]+1];
}];
RACSequence *right = [seq skip:[count integerValue]];
return [RACTuple tupleWithObjects:left, right, nil];
}

关于objective-c - 在 ReactiveCocoa 中编写 Haskell 的突破,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18791862/

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