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

Yritän toistaa sellaisen funktion API: n (kirjoitettu R-kirjaimella), joka hyväksyy mielivaltaisen määrän argumentteja ja käsittelee sitä samalla tavalla kuin se käsittelisi yhtä argumenttia, joka on luettelo erilaisista tietojoukoista.

Onko Mathematica-idiooma, jonka avulla funktio voidaan määrittää siten, että:

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

käyttäytyy sama kuin

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

?

Kommentit

  • Voisit vain kirjoittaa f[args___]:= f[{args}] ja anna määritelmä f[{arg1_, arg2_,...}].

Vastaa

Kuten Andy Ross kommentissa kuvailee, voit tehdä määritelmän, joka esikäsittelee argumentit argumentteina kanoniseen muotoon. Kääntämällä esimerkkiään vain havainnollistamaan joustavuutta:

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

Tosi

Tämä menetelmä on hyödyllinen monimutkaisemmalle esikäsittelylle, mutta tällaisissa yksinkertaisissa tapauksissa on usein helpompaa käyttää Alternatives:

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

Tosi

Huomaa, että kun Alternatives -ominaisuuden avulla sinun on manuaalisesti järjestettävä mallit, koska niitä yritetään peräkkäin. Kuvio args__ | {args__} ei toimisi toivotulla tavalla, koska args__ vastaa {12, 7, 3} yhtenä argumenttina .

Vastaa

Voit käsitellä tätä monella tapaa. Lähestymistapaa, jonka todennäköisesti käyttäisin, voidaan havainnollistaa seuraavalla esimerkillä:

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" *) 

Tietenkin jokainen tämän tekniikan sovellus korvaisi tässä näkyvät merkkijonot joillakin toiminto, joka sopii omiin tarpeisiinsa.

Toinen tapa on kirjoittaa erilliset toiminnot kullekin käsiteltävälle argumenttimallille:

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" *) 

Kommentit

  • Mikä on perustelusi " todennäköisimmin " käyttämiseen Switch useita määritelmiä? Switch on yleensä hitaampaa eikä sitä tule käyttää ilman syytä, IMHO.
  • @ Mr.Wizard. Switch -sovelluksen käyttö vetoaa mielentilaan ohjelmoinnin estetiikasta, koska se järjestää kaikki vaihtoehdot, jotta ne voidaan käsitellä yhdellä toiminnolla. En ' en yleensä ole kaikkia niitä, jotka ovat huolissaan suorituksen nopeudesta – vasta, kun hidas suoritus tulee todella ilmeiseksi.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *