для того, чтобы zipWith ($)
к typecheck мы должны объединить тип zipWith
первый аргумент с типом ($)
. Я напишу их вместе и с уникальными именами, чтобы сделать его более понятным.
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
($) :: ((x -> y) -> x -> y)
Таким образом, zipWith
typechecks тогда и только тогда, когда мы можем предположить, что a ~ (x -> y)
, b ~ x
и c ~ y
. Ничто не останавливает это объединение от успеха, поэтому мы можем заменить эти имена на тип для zipWith
.
zipWith :: ((x -> y) -> x -> y) -> [x -> y] -> [x] -> [y]
($) :: ((x -> y) -> x -> y)
А затем приступить к применению, так как все совпадает красиво Сейчас
zipWith ($) :: [x -> y] -> [x] -> [y]
что эквивалентно до конкретного выбора имен переменных типа с типом вы видели.
Вы можете использовать синтаксис, где ж/сигнатура типа? –
@dave спасибо! Конечно, невозможно – wit
Я думал, что вы использовали какое-то крутое расширение ghc или что-то –