Давайте посмотрим на типы этих функций, например:
:t traverse
traverse
:: (Applicative f, Traversable t) => (a -> f b) -> t a -> f (t b)
:t id
id :: a -> a
У них нет конкретных типов, но есть параметры универсального типа: a
, f
, b
, t
(поправьте меня, если они назвали не параметры универсального типа, пожалуйста)
Если я таким образом объединим id
и traverse
,
:t traverse id [Just 1, Just 2, Nothing]
traverse id [Just 1, Just 2, Nothing] :: Num b => Maybe [b]
Haskell теперь может связывать некоторые конкретные типы для переменных типов a
, f
, b
, t
.
t = []
a = Maybe bb
f = Maybe
b = Num bb => bb
Ниже я вывожу типы и сопоставления с параметрами вручную, есть ли какой-либо способ или инструмент в Haskell, чтобы сделать это автоматически, чтобы он брал некоторые составные части (id
и traverse
) в примере, извлекал их сигнатуры типов в целом и далее вывод производит сопоставление имен параметров универсального типа с конкретными выводимыми типами?
См. также первый пример здесь: https://wiki.haskell.org/Type_inference для выражения map ord
на как Haskell находит привязки реальных типов к именам.
Поэтому, когда мы рассматриваем функции по отдельности, у нас есть только имена a
, f
, b
, t
. Но затем мы объединяем функции и предоставляем некоторую дополнительную информацию, например [Just 1, Just 2, Nothing]
, а имена a
, f
, b
, t
сопоставляются с конкретными типами.
Я хочу поймать и показать это сопоставление автоматически.
f :: forall x1…xn. t
с переменными типаx1
…xn
и типомt
, а также выражение, содержащееf
, это напечатает все значения (типаType
), выбранные дляx1
…xn
. Вы можете найти нужную информацию в выводе флагов GHC-ddump-tc
,-ddump-tc-ast
или-ddump-tc-trace
. - person Jon Purdy   schedule 12.12.2020f
↦Maybe
,t
↦[]
,a
↦Maybe b0
,b
↦b0
}. Это хорошо работает для функций, но не очень для более сложных подтерминов. Это, безусловно, способ добиться этого, просто не совсем то, о чем, как мне кажется, просили, а именно замена. - person Jon Purdy   schedule 14.12.2020