我正在深入研究 js 中的 FP(我是 FP 的新手),我遇到了一个小“问题”,描述了包裹在 Functors 中的 curried 函数的剩余参数
假设我们有以下咖喱情况:
const makeApiCallFuture = curry((path, user, password, params) => Future(...));
const makeApiCallIoFuture = (path) => IO(makeApiCallFuture(path));
// And so on, let's imagine that each next function reduces one more arg
const someFunc = compose(ap(userIO), makeApiCallIoFuture);
我想为每个函数指出它仍然期望多少个柯里化参数,即使这些函数被包装在 Functors 中,以避免开发中的任何混淆。
例如,因为makeApiCallFuture
我们可以写String -> String -> String -> Object -> Future
得很清楚。
Next 函数makeApiCallIoFuture
减少了 curried 参数的数量,并将函数的其余部分包装到IO
.
类型签名变得makeApiCallIoFuture :: String -> IO
或者甚至可能makeApiCallIoFuture :: String -> IO a
我认为不够清楚,因为 IO 中的函数仍然是 curried 并且开发人员需要深入研究代码以了解他们仍然需要传递多少参数。
所以,我的问题是 - 是否可以使用类型签名来指示这种情况?也许可以写出类似的东西:
makeApiCallIoFuture :: String -> IO (String -> String -> Object -> Future)
someFunc :: String -> IO (String -> Object -> Future)
甚至更详细:
makeApiCallIoFuture :: Path -> IO (User -> Password -> Params -> Future)
User = String
Password = String
Params = Object
someFunc :: User -> IO (Password -> Params -> Future)
User = String
Password = String
Params = Object