0

我正在深入研究 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
4

1 回答 1

1

类型签名变为makeApiCallIoFuture :: String -> IO

IO,需要一个类型参数,单独它是一个无效(或:不完整)的类型。

或者甚至makeApiCallIoFuture :: String -> IO a我认为还不够清楚

是什么a?您makeApiCallIoFuture不是通用的 over a,因此a未指定类型是错误的。

是否可以使用类型签名来指示这种情况?也许可以写出类似的东西:

makeApiCallIoFuture :: String -> IO (String -> String -> Object -> Future)

是的,这正是唯一正确的解决方案。

于 2018-10-19T16:59:04.410 回答