小编min*_*nus的帖子

Haskell:foldr vs foldr1

如果我有这个插入功能:

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] '

我很困惑为什么第二个电话无法工作.

我已经查看了foldrfoldr1的定义,并使用简单的算术函数进行了跟踪,但我仍然无法清楚地解释为什么第二次调用失败.

haskell fold

7
推荐指数
3
解决办法
4059
查看次数

ARC:在委托方法中从块内部调用方法时的EXC_BAD_ACCESS

我在委托方法中创建了一个块,我用它来调用另一个类中的静态方法.即使我启用了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的新手,所以如果我错了,请纠正我.

exc-bad-access objective-c objective-c-blocks

4
推荐指数
1
解决办法
1311
查看次数

Prolog:检查两个列表是否具有相同的元素

我是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)

返回所有结果,但之后它们就会挂起.有一个更好的方法吗?

list prolog non-termination failure-slice

3
推荐指数
1
解决办法
8719
查看次数