Helyzet
Van egy f
függvényem, amelyet ki szeretnék egészíteni a g
függvénnyel, ami a h
nevű függvényt eredményezi.
Definíciók
A "kiegészítés" alatt az általános esetben azt értem, hogy a f
függvény bemenetét (egy vagy több argumentum) vagy kimenetét (visszatérési érték) átalakítja.
A "kiegészítés" alatt specifikus esetben (jelenlegi helyzetemre jellemző) azt értem, hogy az f
függvénynek csak a kimenetét (visszatérési értékét) alakítsa át, miközben az összes argumentumot érintetlenül hagyja.
Az "átlátszó" alatt a "kiegészítés" kontextusában (mind az általános eset, mind a specifikus eset) azt értem, hogy a g
implementációját olyan lazán kapcsoljuk össze a f
megvalósításával, mint lehetséges.
Konkrét eset
Jelenlegi helyzetemben a következőket kell tennem:
h a b c = g $ f a b c
Érdekelne, hogy átírjam valami ilyesmire:
h = g . f -- Doesn't type-check.
Mivel h
és g
szemszögéből nézve mindegy, hogy f
milyen érveket vesz fel, csak a visszatérési értékkel foglalkoznak, ezért szoros párosítás lenne az érveket bármilyen módon megemlíteni. Például, ha a f
argumentumszáma a jövőben megváltozik, akkor a h
értéket is módosítani kell.
Eddig
Kérdeztem a lambdabot a #haskell IRC csatornán: @pl h a b c = g $ f a b c
, amire azt a választ kaptam:
h = ((g .) .) . f
Ami még mindig nem elég jó, mivel a (.)
-ek száma f
argumentumainak számától függ.
Általános eset
Nem sokat kutattam ebben az irányban, de erisco
a #haskell oldalon a http://matt.immute.net/content/pointless-fun, ami azt sugallja számomra, hogy lehetséges megoldás az általános esetre.
Eddig
A Luke Palmer által a fenti cikkben definiált függvényeket használva ez egyenértékűnek tűnik azzal, amit eddig tárgyaltunk:
h = f $. id ~> id ~> id ~> g
Úgy tűnik azonban, hogy ez a metódus is sajnos a f
argumentumainak számától függ, ha a f
visszatérési értékét szeretnénk átalakítani -- akárcsak az előző módszerek.
Működő példa
A JavaScriptben például lehetséges az ilyen átlátszó kiegészítés:
function h () { return g(f.apply(this, arguments)) }
Kérdés
Hogyan lehet egy függvényt "átláthatóan bővíteni" a Haskellben?
Főleg a specifikus eset érdekel, de jó lenne tudni, hogyan kell kezelni az általános esetet.
augment
függvényt exportálnánk, biztonságos lenne importálni és más modulokban használni? A biztonságos alatt azt értem: megbízható lenne, vagy furcsa és váratlan sarok esetei lennének? Nagyon szeretem, hogy így nem kell úgy felsorolni a típusokat, mint @hammar válaszánál, de kicsit óvatosan támaszkodok a névben inkoherens nyelvi pragmára. Rövid kérdés: ez egy szivárgó absztrakció? 17.04.2014augment
függvényt exportálják. 17.04.2014OverlappingInstances
pragma használata, ahogy @monocell rámutatott? 17.04.2014