如果我有这个插入功能:
insert x [] = [x]
insert x (h:t)
| x <= h = x:(h:t)
| otherwise = h:(insert x t)
Run Code Online (Sandbox Code Playgroud)
这会产生一个排序列表:
foldr insert [] [1,19,-2,7,43]
Run Code Online (Sandbox Code Playgroud)
但是这个:
foldr1 insert [1,19,-2,7,43]
Run Code Online (Sandbox Code Playgroud)
产生' 不能构造无限类型:a0 = [a0] '
我很困惑为什么第二个电话无法工作.
我已经查看了foldr和foldr1的定义,并使用简单的算术函数进行了跟踪,但我仍然无法清楚地解释为什么第二次调用失败.
我在委托方法中创建了一个块,我用它来调用另一个类中的静态方法.即使我启用了NSZombies,我也会收到EXC_BAD_ACCESS错误.这里有一些关于类似问题的帖子 - 我认为这个是最接近的:
ARC:从委托方法中使用的内部块获取EXC_BAD_ACCESS
但是,到目前为止,我还没有找到任何有帮助的东西.这是代码:
@interface MyClass()
@property (nonatomic, copy) CaseBlock c;
@end
....
//NSURLConnection delegate method
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys:
//blows up after executing this
^() { [AnotherClass staticMethod]; },authURL,
^() { NSLog(@"TODO");}, searchURL,
^() { NSLog(@"TODO"); }, itemURL,
nil];
self.c = [[d objectForKey:[self.url path]] copy];
if (self.c) {
self.c();
} else { NSLog(@"WARN unexpected response path"); }
}
Run Code Online (Sandbox Code Playgroud)
这是我第一次尝试使用块,但我可以说这导致了问题,因为从块外部调用方法可以正常工作.而且,据我所知,我编写的所有代码实际上都被执行了,然后发生了EXC_BAD_ACCESS错误.但是,我是Objective-C的新手,所以如果我错了,请纠正我.
我是Prolog的新手,我在检查两个列表是否具有完全相同的元素时遇到了问题.元素可能具有不同的顺序.我有这个代码:
myremove(X, [X|T], T).
myremove(X, [H|T], [H|R]) :-
myremove(X, T, R).
same_elements([], []).
same_elements([H1|T1], L2) :-
myremove(H1, L2, Nl2),
same_elements(T1, Nl2).
Run Code Online (Sandbox Code Playgroud)
它的工作原理除外
?- same_elements([b,c,a], X).
Run Code Online (Sandbox Code Playgroud)
返回第一个结果后导致内存不足错误.那么我试图通过检查列表的长度是否相等并检查H1是L2的成员来缩小结果集:
mylength([], 0).
mylength([_|T], R) :-
mylength(T, Nr),
R is Nr+1.
mymember(X, [X|_]).
mymember(X, [_|T]) :-
mymember(X, T).
same_elements([], []).
same_elements([H1|T1], L2) :-
mylength([H1|T1], X),
mylength(L2, Y),
Y = X,
mymember(H1, L2),
myremove(H1, L2, Nl2),
same_elements(T1, Nl2).
Run Code Online (Sandbox Code Playgroud)
现在两个
?- same_elements([b,c,a], X).
?- same_elements(X, [b,c,a]).
Run Code Online (Sandbox Code Playgroud)
返回所有结果,但之后它们就会挂起.有一个更好的方法吗?