Re: list transformers and Prolog HOF type behaviours...

Paulo Moura <[email protected]>
Newsgroups gmane.comp.gnu.prolog.general
Message-ID <[email protected]>
On 16/12/2013, at 17:24, Lindsey Spratt <[email protected]> wrote:

> Sean,
> Here's a solution:
> 
> map(_Map, [], []).
> map(Map, [HIN|TIN], [HOUT|TOUT]) :-
> 	Map =..Terms,
> 	append(Terms, [HIN,HOUT], TermsExtended),
> 	MapExtended =.. TermsExtended,
> 	call(MapExtended),
> 	map(Map, TIN, TOUT).

The code can be simplified by using the built-in and standard call/N control construct:

map(_Map, [], []).
map(Map, [HIN|TIN], [HOUT|TOUT]) :-
	call(Map, HIN, HOUT),
	map(Map, TIN, TOUT).

Cheers,

Paulo

> This works 'both ways':
> map(lower_upper, [a,b], U) gives U=['A','B']
> map(lower_upper, L, ['A','B']) gives L=[a,b].
> 
> The 'Map' can be any term where it is meaningful to append two arguments to the end of the term and evaluate the extended term.
> 
> Lindsey
> 
> On Dec 16, 2013, at 11:41 AM, emacstheviking <[email protected]> wrote:
> 
>> I decided to write a maplist type predicate that will be used to map a function over a list and return the list of transformed values. I have wanted this for a while now and I sat down and came up with this. It works BUT I am not happy with it for reasons outlined below so any suggestions etc. are welcome.
>> 
>> maplist2(In, X, Out) :-
>> 	transform_list(In, X, [], Out).
>> 
>> transform_list([], _, Acc, Final) :-
>> 	reverse(Acc, Final).
>> 
>> transform_list([E|Es], Xfn, Acc, Final) :-
>> 	Xform =.. [Xfn, E, Out],
>> 	call(Xform),
>> 	transform_list(Es, Xfn, [Out|Acc], Final).
>> 
>> For example, if I wanted to convert a string from lower case to upper case I would have to use a list of atoms to satisfy lower_upper/2, that's not an issue. The assumption for my maplist2 is that the transformer function has arity 2 and the first paramter is the input and the second is the output.
>> 
>> What is the issue though is that lower_upper/2 works either way around and if I wanted to convert a->'A' or 'A'->a then how would that work?
>> 
>> Haskell has sections and "flip"..is there a Prolog way to say that I want to change the order of evaluation of a function if you catch my drift?
>> 
>> Thinking on my feet here, it would be the difference between currently passing in:
>> 
>>     lower_upper
>> 
>> and then in a cool world using
>> 
>>     lower_upper(X,_)
>> or
>>     lower_upper(_,X)
>> 
>> instead and "it" would know to replace "_" with the input parameter...I am going to see what I can come up with!
>> Thanks,
>> Sean.
>> 
>> 
>> 
>> _______________________________________________
>> Users-prolog mailing list
>> [email protected]
>> https://lists.gnu.org/mailman/listinfo/users-prolog
> 
> _______________________________________________
> Users-prolog mailing list
> [email protected]
> https://lists.gnu.org/mailman/listinfo/users-prolog

-----------------------------------------------------------------
Paulo Moura
Logtalk developer

Email: <mailto:[email protected]>
Web:   <http://logtalk.org/>
-----------------------------------------------------------------
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.