Отражение внутренних объектов объекта в сигнатуре типа
Я погружаюсь в 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)
Да, именно это единственное правильное решение.