f [arg1, arg2, …, argN] vs. f [{arg1, arg2, …, argN}] (Magyar)

Megpróbálom reprodukálni egy függvény API-ját (R betűvel írva), amely tetszőleges számú argumentumot fogad el, és ugyanúgy kezeli, mint egyetlen olyan argumentumot, amely a különböző adatsorok listája.

Van-e olyan Mathematica idióma, amely lehetővé teszi egy függvény definiálását, hogy:

f[ arg1, arg2, ..., argN ] 

viselkedjen ugyanaz, mint

f[ {arg1, arg2, ..., argN} ] 

?

Megjegyzések

  • Csak írhatna f[args___]:= f[{args}], majd adja meg a f[{arg1_, arg2_,...}] definíciót.

Válasz

Amint Andy Ross leírta egy megjegyzésben, meghatározhat egy meghatározást, amely az argumentum (oka) t kanonikus formába dolgozza fel. Példáját egyszerűen a rugalmasság szemléltetésére fordítja:

f[{args__}] := f[args] f[args__] := Multinomial[args] / Plus[args] f[{12, 7, 3}] == f[12, 7, 3] 

Igaz

Ez a módszer bonyolultabb előfeldolgozáshoz hasznos, de ilyen egyszerű esetekben gyakran könnyebb használni a Alternatives:

g[{args__} | args__] := Multinomial[args]/Plus[args] g[{12, 7, 3}] == g[12, 7, 3] 

Igaz

Ne feledje, hogy amikor A Alternatives használatával manuálisan kell megrendelnie a mintákat, mert azokat egymás után próbálják ki. A args__ | {args__} minta nem működne a kívánt módon, mert az args__ egyetlen argumentumként illeszkedik a {12, 7, 3} .

Válasz

Ezt sokféleképpen lehet kezelni. Az a megközelítés, amelyet nagy valószínűséggel alkalmaznék, a következő példával illusztrálható:

f[seqn : ___] := Module[{args = {seqn}}, Switch[args, {{___}}, "List of args", {_}, "One arg", {_, __}, "Two or more args", {}, "No args" ]] f[{x, y, z}] (* ==> "List of args" *) f[{x}] (* ==> "List of args" *) f[] (* ==> "No args" *) f[x] (* ==> "One arg" *) f[x, y, z] (* ==> "Two or more args" *) 

Természetesen ennek a technikának az egyes alkalmazásai az itt látható karakterláncokat helyettesítik a saját igényeinek megfelelő művelet.

Egy másik megközelítés az, hogy különálló függvényeket írunk az egyes kezelni kívánt argumentum mintákhoz:

g[args : {___}] := "List of args" g[] := "No args" g[arg_] := "One arg" g[arg_, rest__] := "Two or more args" g[{x, y, z}] (* ==> "List of args" *) g[{x}] (* ==> "List of args" *) g[] (* ==> "No args" *) g[x] (* ==> "One arg" *) g[x, y, z] (* ==> "Two or more args" *) 

Megjegyzések

  • Mi az oka annak, hogy " valószínűleg " a Switch több meghatározás alatt? A Switch általában lassabb, és ok nélkül nem használható, IMHO.
  • @ Mr.Wizard. A Switch használata apellál az én programozási esztétikai érzékemre, mert az összes alternatívát megszervezi, így egyetlen funkcióval kezelhetők. <

általában nem aggódom a végrehajtási sebesség miatt – csak addig, amíg a lassú végrehajtás valóban nyilvánvalóvá nem válik.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük