2016-10-22 2 views
2

ich eine Situation, wo ich brauche, dies zu tun:Ramda currying: Wie mehrere Parameter anwenden Argument

const f = (obj) => assoc('list', createList(obj), obj) 

Aufgrund der Tatsache, dass ich das Argument für den zweiten und den dritten Parameter benötigen, verbietet mir zu tun, so etwas wie:

const f = assoc('list', somehowGetObj()) 

ich habe auch versucht das, aber das hat nicht funktioniert:

const f = assoc('list', createList(__)) 
const f = converge(assoc, [createList, identity]) 

gibt es Ein richtiger Weg, dies durch Curry zu tun?

Antwort

4

Eine weitere Option ist

chain(createList, assoc('list')) 

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

aktualisieren

Für weitere Erklärung, wie das funktioniert, werde ich die Variante verwendet werden, die mit der nächsten Version von Ramda arbeiten:

chain(assoc('list'), createList) 

zeigen, wie es die aktuelle Signatur übereinstimmt :

chain :: Chain m => (a -> m b) -> m a -> m b 

Ramda Funktionen wie FantasyLandMonads und damit also auch als 01 behandelt. So um die oben auf Funktionen zu spezialisieren, haben wir

chain :: (a -> Function x b) -> Function x a -> Function x -> b 

aber Function x y können einfacher als x -> y geschrieben werden, so können die oben einfacher geschrieben als

chain :: (a -> x -> b) -> (x -> a) -> (x -> b) 

Dann können Sie diese (Fach-) verwenden Typen:

createList :: OriginalData -> YourList        (x -> a) 
assoc :: String -> YourList -> OriginalData -> EnhancedData 
assoc('list') :: YourList -> OriginalData -> EnhancedData   (a -> x -> b) 

und damit

chain(assoc('list'), createList) :: OriginalData -> EnhancedData (x -> b) 
+0

Es funktioniert! Allerdings scheint dieser Anwendungsfall nicht von den Dokumenten abgedeckt zu werden, oder fehlt mir etwas? http://ramdajs.com/docs/#chain – MoeSattler

+0

Sie haben Recht. Ramdas Dokumentation stimmt nicht mit dem Code überein. Die dokumentierte Signatur ist das, was gewünscht wird, und [eine kürzlich erfolgte Änderung] (https://github.com/ramda/ramda/pull/1936) erhält den entsprechenden Code. Wenn Sie mit der nächsten Version von Ramda arbeiten, müssten Sie die Parameter umkehren: 'chain (assoc ('list'), createList)'. –

1
const f = converge(assoc('list'), [createList, identity])