Получение подписи типа для функции в elm

Я использую вяз 0.18.

Допустим, у меня есть функция, которая связывает воедино кучу вещей, которые я собрал в спешке. Это работает, но я не уверен, что это за сигнатура типа, и я хотел бы, чтобы elm сказал мне (или подсказал мне) эту сигнатуру типа.

Например, я использую graphql и имею функцию, которая принимает строку graphql, декодер (который также не имеет сигнатуры типа) и Cmd Msg и запускает их через HttpBuilder.

graphQLPost graphiql decoder msg =
    HttpBuilder.post (url ++ "api")
        |> HttpBuilder.withStringBody "text/plain" graphiql
        |> HttpBuilder.withExpect (Http.expectJson decoder)
        |> HttpBuilder.send msg

Это работает, хотя я не знаю, почему. Я пытался установить для него сигнатуру типа graphQLPost : String -> Json.Decode.Decoder -> Cmd Msg, но получаю сообщение об ошибке.

Выяснение этой сигнатуры типа для меня не так важно, как поиск способа вызвать их через elm. Есть ли команда, которую я могу ввести в elm-repl, или что-то, что скажет мне подпись?


person Mark Karavan    schedule 12.11.2017    source источник


Ответы (2)


Elm REPL сделает это за вас:

> import Http
> import HttpBuilder
> type Msg = Msg
> url = "..."
"..." : String
> graphQLPost graphiql decoder msg = \
|     HttpBuilder.post (url ++ "api") \
|         |> HttpBuilder.withStringBody "text/plain" graphiql \
|         |> HttpBuilder.withExpect (Http.expectJson decoder) \
|         |> HttpBuilder.send msg
<function>
    : String
      -> Json.Decode.Decoder a
      -> (Result.Result Http.Error a -> msg)
      -> Platform.Cmd.Cmd msg

Когда вы пишете функцию и нажимаете <Enter>, она показывает вам подпись. В этом случае подпись:

graphQLPost : String
      -> Json.Decode.Decoder a
      -> (Result.Result Http.Error a -> msg)
      -> Platform.Cmd.Cmd msg
person Chad Gilbert    schedule 13.11.2017
comment
Оно работает. Мне пришлось обрезать некоторые вещи, такие как Json.Decode, из-за предложения as, но это скомпилировано: graphQLPost : String -> Decoder a -> (Result.Result Http.Error a -> msg) -> Cmd msg - person Mark Karavan; 13.11.2017
comment
У меня нет подписи типа в elm repl 0.19 - person FlogFR; 30.08.2018

Запуск elm-make с параметром --warn заставит компилятор предложить включить аннотацию типа в функции, у которых ее нет, и предоставит ее для копирования и вставки.

Кроме того, некоторые интеграции редактора, такие как расширение языка Visual Studio Code для Elm, будут отображать предупреждения такого рода в виде значка подсказки, по которому можно щелкнуть, чтобы автоматически добавить аннотацию отсутствующего типа. Вы можете установить для этого сочетание клавиш, чтобы сделать это, не отрывая рук от клавиатуры.

person Kevin Yank    schedule 15.11.2017
comment
К сожалению, это решение больше не работает с elm 0.19. Вы не знаете, есть ли другой вариант? Очень жаль, что нельзя просто открыть реплику и запустить :t graphQLPost, как это можно сделать с некоторыми, гм, другими языками. - person pdoherty926; 12.09.2018
comment
Я тоже скучаю по нему в 0.19. Говорят, что это возвращается в той или иной форме (возможно, с программным доступом к функциям вывода типов компилятора); он просто не попал в первоначальный выпуск. - person Kevin Yank; 12.09.2018