Этот пример, кажется, нарушает тип sig для $, и он работает

Если тип ($)(a -> b) -> a -> b, то почему вам разрешено каррировать его как ($2)? 2 не относится к типу (a -> b). См. пример ниже.

map ($2)[(+1),(+2)]

Это законно, круто и интуитивно понятно. Скажите, пожалуйста, как это согласуется с правилами системы типов?

Ваше здоровье


person TheIronKnuckle    schedule 09.07.2013    source источник
comment
Это очень похоже на этот вопрос, заданный ранее сегодня.   -  person shachaf    schedule 09.07.2013
comment
эх, не заметил. Вот примерно такой же вопрос. Самый неловкий пост SO: 3 голосование за закрытие   -  person TheIronKnuckle    schedule 09.07.2013


Ответы (1)


Поведение, которое вы наблюдаете, связано с тем, как работает частичное приложение для инфиксных операторов. Это часто называют «приложением раздела», и вы применяете 2 как «правильный раздел», который будет вторым аргументом. Так что у тебя есть:

($) :: (a -> b) -> a -> b
                   ^
                   |
                  This is the type variable for the argument '2'

И вы можете подтвердить это через:

ghci
> :t ($2)
($2) :: Num a => (a -> b) -> b

Скорее всего, вы найдете эту информацию скрытой где-нибудь в наиболее прилично полных учебниках или посмотрите отчет Haskell секция на секции.

person Thomas M. DuBuisson    schedule 09.07.2013
comment
Также см., возможно, более доступную вики-страницу: haskell.org/haskellwiki/Section_of_an_infix_operator - person Jeff Burka; 09.07.2013