Tap 的函数签名(K 组合器)
Function signature of Tap (K-combinator)
我在书上看到tap函数(也叫K-Combinator)的函数签名如下:
tap :: (a -> *) -> a -> a
"This function takes an input object a and a function that performs some action on a. It runs the given function with the supplied object and then returns the object."
- 谁能帮我解释一下函数签名中的星号(*)是什么意思?
- 下面的实现是否正确?
- 如果三种实现方式都正确,那么什么时候应该使用哪一种呢?有例子吗?
实施 1:
const tap = fn => a => { fn(a); return a; };
tap((it) => console.log(it))(10); //10
实施 2:
const tap = a => fn => { fn(a); return a; };
tap(10)((it) => console.log(it)); //10
实施 3:
const tap = (a, fn) => {fn(a); return a; };
tap(10, (it) => console.log(it)); //10
这看起来很像 Ramda definition。里面的*
估计有误。 (免责声明:我是 Ramda 的作者之一。)它应该是
// tap :: (a -> b) -> a -> a
类似于您的第一个实现:
const tap = fn => a => { fn(a); return a; };
或者 Ramda 的版本:
const tap = curry((fn, a) => { fn(a); return a; });
匹配该签名并且恕我直言,主要用于调试上下文。我用它来临时将日志记录语句引入功能管道1:
// :: Map String User
const users = fetchUsersFromSomewhere();
// :: [Comment] -> [Number]
const userRatingForComments = R.pipe(
R.pluck('username'), // [Comment] -> [String]
R.tap(console.log), // for debugging, need to include `bind` in browser envs
// ^^^^^^^^^^^^^^^^^^
R.map(R.propOf(users)), // [String] -> [User]
R.pluck('rating') // [User] -> [Number]
);
不过,这确实不是 K 组合器。
1 此代码示例来自我在 Ramda 上的 old article。
我在书上看到tap函数(也叫K-Combinator)的函数签名如下:
tap :: (a -> *) -> a -> a
"This function takes an input object a and a function that performs some action on a. It runs the given function with the supplied object and then returns the object."
- 谁能帮我解释一下函数签名中的星号(*)是什么意思?
- 下面的实现是否正确?
- 如果三种实现方式都正确,那么什么时候应该使用哪一种呢?有例子吗?
实施 1:
const tap = fn => a => { fn(a); return a; };
tap((it) => console.log(it))(10); //10
实施 2:
const tap = a => fn => { fn(a); return a; };
tap(10)((it) => console.log(it)); //10
实施 3:
const tap = (a, fn) => {fn(a); return a; };
tap(10, (it) => console.log(it)); //10
这看起来很像 Ramda definition。里面的*
估计有误。 (免责声明:我是 Ramda 的作者之一。)它应该是
// tap :: (a -> b) -> a -> a
类似于您的第一个实现:
const tap = fn => a => { fn(a); return a; };
或者 Ramda 的版本:
const tap = curry((fn, a) => { fn(a); return a; });
匹配该签名并且恕我直言,主要用于调试上下文。我用它来临时将日志记录语句引入功能管道1:
// :: Map String User
const users = fetchUsersFromSomewhere();
// :: [Comment] -> [Number]
const userRatingForComments = R.pipe(
R.pluck('username'), // [Comment] -> [String]
R.tap(console.log), // for debugging, need to include `bind` in browser envs
// ^^^^^^^^^^^^^^^^^^
R.map(R.propOf(users)), // [String] -> [User]
R.pluck('rating') // [User] -> [Number]
);
不过,这确实不是 K 组合器。
1 此代码示例来自我在 Ramda 上的 old article。