В FP вы должны стараться как можно больше разбивать проблемы, избегать необязательных аргументов и управлять потоком, используя вместо этого меньшие кусочки.
Кроме того, Ramda полезна, но в ней отсутствуют некоторые типы данных, такие как Maybe
что может быть действительно полезным в этом сценарии.Взгляните на SanctuaryJS .
Следующий код делает именно то, что вы хотите, используя чисто функциональный подход
const { toMaybe, maybe, pipe } = sanctuary
const a = f => value => value2 => pipe ([
toMaybe, // converts to Just (value) or Nothing, when nil
maybe (value2) (f) // if Nothing, value2, otherwise, value is passed to f
]) (value)
// Output: 3
const output1 = a (x => x + 1) (2) (4)
console.log ('output1: ', output1)
// Output: 4
const output2 = a (x => x + 1) (null) (4)
console.log ('output2: ', output2)
<script src="https://bundle.run/sanctuary@0.15.0"></script>
Обратите внимание, что я не проверял, что f
является Function
.JavaScript - это динамически типизированный язык: просто предположим, что он будет Function
, и быстро провалится, если это не так.
Рефакторированный подход для использования преимуществ частичного применения:
const { toMaybe, maybe, pipe } = sanctuary
// Re-arranged parameters: now value is the latest one.
const a = f => value2 => pipe ([
toMaybe, // converts to Just (value) or Nothing, when nil
maybe (value2) (f) // if Nothing, value2, otherwise, value is passed to f
])
// Output: 3
const output1 = a (x => x + 1) (4) (2)
console.log ('output1: ', output1)
// Output: 4
const output2 = a (x => x + 1) (4) (null)
console.log ('output2: ', output2)
<script src="https://bundle.run/sanctuary@0.15.0"></script>