Я погружаюсь в 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