Ruby (et Perl) a un concept de Flip Flop: , qui compte une liste des ordinaux, tels que p> commencerait à imprimer lorsqu'il atteindrait "troisième" et arrêterait quand il atteint "Cinquième": p> existe un concept de programmation fonctionnel analogue à cela, ou cela serait-il normalement décrit en termes de à l'épreuve des code> s? Je ne demande pas à une langue particulière, quel terme vous utiliseriez pour le décrire. P> p>
3 Réponses :
dépend de la langue fonctionnelle. Que diriez-vous de cela? ajouté: strong> Bien sûr, Ruby n'est pas une langue fonctionnelle pure, j'ai donc décidé de le réécrire à Erlang: P> #!/usr/bin/env escript
flipflop(E, {[H|T] = Conditions, FlipFlop}) ->
case H(E) of
true ->
{true, {T, not FlipFlop}};
false ->
{FlipFlop, {Conditions, FlipFlop}}
end;
flipflop(_, {[], FlipFlop}) ->
{FlipFlop, {[], FlipFlop}}.
flipflop_init(Conditions) ->
{[], {Conditions, false}}.
main([]) ->
{L, _} =
lists:foldl(
fun(E, {L2, FFState}) ->
case flipflop(E, FFState) of
{true, FFState2} ->
{[E|L2], FFState2};
{false, FFState2} ->
{L2, FFState2}
end
end,
flipflop_init([
fun(E) -> E == 3 end,
fun(E) -> E == 5 end,
fun(E) -> E == 7 end,
fun(E) -> E == 11 end
]),
lists:seq(0,20)
),
io:format("~p~n", [lists:reverse(L)]),
ok.
Savez-vous s'il y a un terme décrivant le concept?
Dans une langue fonctionnelle telle que HASKELL, vous passeriez dans les conditions de retournement et de flop comme prédicats et filtrez une liste d'entrée basée sur elle. Par exemple, ce qui suit est une définition de flipflop code> dans HASKELLL (ne vous inquiétez pas de la mise en œuvre si vous ne connaissez pas HASKELL, la partie clé est la manière dont elle est utilisée):
> flipflop (== 3) (== 5) [1..10]
[3,4,5]
Même chose que la solution de @ Nanothief, mais dans SCALA:
> flipFlop[Int](_ == 3, _ == 5, Nil) List() > flipFlop[Int](_ == 3, _ == 5, 1 to 19) Vector(3, 4, 5)
Quelles langues envisagez-vous de FP? Il existe de nombreuses approches différentes et certaines peuvent répondre à vos besoins. En outre, êtes-vous, dans cet exemple, en tapant simplement la troisième - cinquième lignes? Vous voudrez peut-être expliquer plus en détail ce que vous espérez se produire.
@James Black: Comment est la nouvelle version de la question?