Отражение внутренних объектов объекта в сигнатуре типа - PullRequest
0 голосов
/ 19 октября 2018

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

0 голосов
/ 19 октября 2018

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...