我是一个新的Prolog开发人员,我试图让合并排序工作.查询
mergesort([2,1],T).
Run Code Online (Sandbox Code Playgroud)
会生产
T=[1,2];
T=[1,2];
T=[1,2];
...
Run Code Online (Sandbox Code Playgroud)
因此,虽然它似乎"正确"地对序列进行排序但它不会停止
另一方面,如果我有一个查询,如
mergesort([2,1],[2,1])
Run Code Online (Sandbox Code Playgroud)
它进入了一个无限循环.我想知道为什么会这样?
append([H|T],LISTB,[H|LISTC]):-
append(T,LISTB,LISTC).
split(LIST,L1,L2):-
length(LIST,LENGTH),
M is div(LENGTH,2),
append(L1,L2,LIST),
length(L1,L1LENGTH),
(L1LENGTH =:= M).
merge(A,[],A).
merge([],B,B).
merge([A|TA],[B|TB],[A|MERGED]) :-
A =< B,
merge(TA,[B|TB],MERGED).
merge([A|TA],[B|TB],[B|MERGED]) :-
B < A,
merge([A|TA],TB,MERGED).
mergesort([],[]).
mergesort([X],[X]).
mergesort(LIST,OLIST):-
split(LIST,L1,L2),
mergesort(L1,OLIST1),
mergesort(L2,OLIST2),
merge(OLIST1,OLIST2,OLIST).
Run Code Online (Sandbox Code Playgroud) 我的商店看起来像这样
{
itemA: {val1, val2, val3},
itemB: {val1, val2, val3},
....
}
Run Code Online (Sandbox Code Playgroud)
在我的选择器文件中,我有这样的东西
const getItemAobject(state) => return state.itemA;
const getItemBobject(state) => return state.itemB;
Run Code Online (Sandbox Code Playgroud)
....
const selectItemA = createSelector([getItemAobject], (itemAobject) => itemAobject);
const selectItemB = createSelector([getItemBobject], (itemBobject) => itemBobject);
Run Code Online (Sandbox Code Playgroud)
终于在mapStateToProps我有
mapStateToProps(){
{
itemA: selectItemA(state)
itemB: selectItemB(state)
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我的选择器没有做任何花哨的事情,我应该使用重新选择吗?我可以轻松地做到这一点
mapStateToProps(){
{
itemA: state.itemA
itemB: state.itemB
}
}
Run Code Online (Sandbox Code Playgroud)
如果有选择器,使用选择器有什么好处?