haskell concat 的 Prolog 等价物
Prolog equivalent for haskell concat
我试图在序言中找到 haskell 的 concat
的等价物。
例如,我们有一个这样的列表:[[[a],[b]],[[c],[d]]]
.
我需要将此列表连接到这样的列表 [[a,b],[c,d]]
。到目前为止,我已经用 append
尝试了一些代码,但我想不出正确的解决方案。
你可以用flatten/2
和append/3
解决这个问题,方法是:
my_concat([],L,L).
my_concat([H|T],LT,LO):-
flatten(H,H1),
append(LT,[H1],LT1),
my_concat(T,LT1,LO).
?- my_concat([[[a],[b]],[[c],[d]]],[],L).
L = [[a, b], [c, d]]
另一种方式
my_concat([X], [FX]):-
flatten(X,FX).
my_concat([H|T], [FH| FT]):-
my_concat(T,FT),
flatten(H,FH).
您的示例与 Haskell 的 concat
:
的正常行为不符
Prelude> concat [[[1],[2]],[[3],[4]]]
[[1],[2],[3],[4]]
要执行您想要的操作,您需要将 concat
映射到输入列表中的各个列表:
Prelude> map concat [[[1],[2]],[[3],[4]]]
[[1,2],[3,4]]
在 SWI-Prolog 中你有 append/2
(两个参数而不是更常见的 append/3
的三个参数)对应于 Haskell 的 concat
:
?- append([[[a],[b]],[[c],[d]]], Flattened).
Flattened = [[a], [b], [c], [d]].
并且在 SWI-Prolog 中还有一个 maplist/N
谓词家族对应于 Haskell 的 map
:
?- maplist(append, [[[a],[b]],[[c],[d]]], FlattenedButDifferently).
FlattenedButDifferently = [[a, b], [c, d]].
我试图在序言中找到 haskell 的 concat
的等价物。
例如,我们有一个这样的列表:[[[a],[b]],[[c],[d]]]
.
我需要将此列表连接到这样的列表 [[a,b],[c,d]]
。到目前为止,我已经用 append
尝试了一些代码,但我想不出正确的解决方案。
你可以用flatten/2
和append/3
解决这个问题,方法是:
my_concat([],L,L).
my_concat([H|T],LT,LO):-
flatten(H,H1),
append(LT,[H1],LT1),
my_concat(T,LT1,LO).
?- my_concat([[[a],[b]],[[c],[d]]],[],L).
L = [[a, b], [c, d]]
另一种方式
my_concat([X], [FX]):-
flatten(X,FX).
my_concat([H|T], [FH| FT]):-
my_concat(T,FT),
flatten(H,FH).
您的示例与 Haskell 的 concat
:
Prelude> concat [[[1],[2]],[[3],[4]]]
[[1],[2],[3],[4]]
要执行您想要的操作,您需要将 concat
映射到输入列表中的各个列表:
Prelude> map concat [[[1],[2]],[[3],[4]]]
[[1,2],[3,4]]
在 SWI-Prolog 中你有 append/2
(两个参数而不是更常见的 append/3
的三个参数)对应于 Haskell 的 concat
:
?- append([[[a],[b]],[[c],[d]]], Flattened).
Flattened = [[a], [b], [c], [d]].
并且在 SWI-Prolog 中还有一个 maplist/N
谓词家族对应于 Haskell 的 map
:
?- maplist(append, [[[a],[b]],[[c],[d]]], FlattenedButDifferently).
FlattenedButDifferently = [[a, b], [c, d]].