0

Ich versuche eifrig funktionale Programmierung in js zu lernen, aber ich habe eine harte Zeit. Ich fühle mich wie ich ständig Sachen tue, wie diese, die einfach nicht richtig überhaupt nicht fühlen:Composing Funktion mit höherer arity in Ramda

export const getParamFromUrl = R.curry((name, url) => R.compose(
    R.match(new RegExp(`[?&]${name}=([^&]*)`)) 
)(url)); 

Ich fühle mich nicht wie ich immidiately Aufruf komponieren sollte. Was ist also der richtige Weg, um eine Funktionszusammensetzung mit einer Genauigkeit von zwei zu machen?

EDIT: Aus Gründen der Klarheit ist dies die eigentliche Funktion, wie es aussieht (und ich weiß, dass dies nicht der beste Weg ist, Query-Strings zu erhalten)

/* util.toMaybe takes a function and a value and returns Nothing() 
    if the function returns true and Just(value) if it returns false. 
    I think this is the HM: 
    util.toMaybe :: (a -> Boolean) -> a -> Maybe a 
*/ 
export const getParamFromUrl = R.curry((name, url) => R.compose(
    R.chain(util.toMaybe(R.isEmpty)), 
    R.map(R.nth(1)), 
    util.toMaybe(R.isEmpty), 
    R.match(new RegExp(`[?&]${name}=([^&]*)`)) 
)(url)); 

Mit der akzeptierten Antwort dies werden würde:

export const getParamFromUrl = R.curry(R.compose(
    R.chain(util.toMaybe(R.isEmpty)), 
    R.map(R.nth(1)), 
    util.toMaybe(R.isEmpty), 
    (name, url) => R.match(new RegExp(`[?&]${name}=([^&]*)`), url) 
)); 
+0

Vielleicht bekomme ich nicht die funktionale Seite der Dinge. Müssen Sie sofort curry? Was ist falsch an einer regulären Funktion wie '(name, url) => url.match (new RegExp()) [1]' Sie können diese Funktion immer später umbrechen/curry, oder? – fet

+0

Das ist auch eine schrecklich unzuverlässige Art, URL-Parameter zu parsen – naomik

Antwort

1

Es ist nicht wirklich klar, was Sie mit diesem compose Aufruf zu tun beabsichtigen. Die Funktion wird ohne sie gleich gut funktionieren, und es ist klarer.

const getParamFromUrl = R.curry((name, url) => 
    R.match(new RegExp(`[?&]${name}=([^&]*)`), url)); 

Wenn Sie auf das Hinzufügen eines weiteren Funktion in die Zusammensetzung planen, dann können Sie es wie folgt tun:

const getParamFromUrl = R.curry(R.compose(
    nth(1), 
    (name, url) => R.match(new RegExp(`[?&]${name}=([^&]*)`), url) 
)); 

Beachten Sie, dass fortechnicalreasons, das Ergebnis compose ist nicht auto-curried, so dass Sie Das musst du selbst tun.

Sie können dies in Aktion auf der Ramda REPL sehen.

+0

Vielen Dank, das Komponieren der höheren Funktion macht so viel Sinn. Ich habe das Gefühl, dass diese Idee genau das ist, nach der ich gesucht habe, aber ich konnte einfach nicht selbst trainieren. Ich habe meine Frage bearbeitet, um zu klären, warum ich überhaupt Komposition verwendet habe. –