Отражение внутренних объектов объекта в сигнатуре типа

Я погружаюсь в FP в JS (я новичок в FP), и я столкнулся с небольшой "проблемой", описывающей оставшиеся аргументы карри функции, обернутые в Functors

Допустим, у нас есть следующая карри ситуация:

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 ответ

Решение

Подпись типа становится makeApiCallIoFuture :: String -> IO

Нет. IO ожидает параметр типа, только он является недопустимым (или: неполным) типом.

или, может быть, даже makeApiCallIoFuture :: String -> IO a что я думаю, не достаточно ясно,

Что такое a? Ваш makeApiCallIoFuture не является общим aоставив a тип не указан неверно.

Можно ли указать такие ситуации с помощью сигнатур типа? Может быть, можно написать что-то вроде:

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

Да, именно это единственное правильное решение.

Другие вопросы по тегам