Определение $ -оператора Хаскелла - PullRequest
0 голосов
/ 10 июня 2018

Этот post и другие источники, такие как this , настаивают на том, что определение $ -оператора

($) :: (a -> b) -> a -> b
f $ x = f x

или

($) f x = f x

или

($) = id

, но я не понимал, почему это определение могло бы заменить скобки, поэтому я попытался воспроизвести это сам и изучить поведение, определив:

k :: (a -> b) -> a -> b
k f x = f x

Но то, что я получил, это:

-- these work:
(+2) `k` 4
(+2) `id` 4
sum `k` [1,2]
sum `id` [1,2]
map (flip(-)3) $ filter even `k`  filter (>=0) [-5..10]
map (flip(-)3) $ filter even `id` filter (>=0) [-5..10]

-- these don't:
sum `k`  1:[2]
sum `id` 1:[2]
map (flip(-)3) `id` filter even $ filter (>=0) [-5..10]

Не должно ли k быть заменой $?Что я делаю не так?

1 Ответ

0 голосов
/ 10 июня 2018

Вы пропустили объявление исправления :

infixr 0 $

Или в вашем примере:

infixr 0 `k`

Объявления исправления сообщают анализатору, какой приоритет / ассоциативностьинфиксного оператора is.

...