The tap combinator lets a function perform a side effect, such as logging, inside a composition without changing the value flowing through it. It bridges useful void functions with functional control flow. section 4.6
Logging during a composition
const debug = R.tap(debugLog);\nconst cleanInput = R.compose(normalize, debug, trim);\n\nconst isValidSsn = R.compose(debug, checkLengthSsn, debug, cleanInput);\nisValidSsn('444-44-4444');\n\n// logs intermediate values, then returns the final result section 4.6
tap :: (a -> *) -> a -> a
Use the signature to see that tap accepts an action and returns the original input after running that action. section 4.6

