在类型签名中反映对象内部

时间:2018-10-19 14:07:10

标签: javascript functional-programming ramda-fantasy

我正在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,这很清楚。

下一个函数makeApiCallIoFuture减少了已处理参数的数量,并将该函数的其余部分包装到IO中。

类型签名变成makeApiCallIoFuture :: String -> IO或什至makeApiCallIoFuture :: String -> IO a,我认为这还不够清楚,因为IO中的函数仍在使用中,并且开发人员将需要深入研究代码以了解他们有多少个参数仍然需要通过。

所以,我的问题是-是否可以使用类型签名指示这种情况?也许可以这样写:

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

1 个答案:

答案 0 :(得分:1)

  

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

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

  

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

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

  

是否可以使用类型签名指示这种情况?也许可以这样写:

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

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