Почему функция является первым аргументом в Haskell - PullRequest
2 голосов
/ 19 мая 2019

Я начал изучать Хаскель.Мне любопытно, почему в Haskell функция берется в качестве первого аргумента для функций высшего порядка для списков.Например, вот определение map:

map :: (a -> b) -> [a] -> [b]

Это означает, что я могу использовать его в префиксной или операторной форме, например:

-- yields [3,5,7]
map (+ 2) [1,3,5]
-- we can chain like that
filter (< 4) (map (+ 2) [1,3,5])

-- or in operator form 
(+ 2) `map` [1,3,5]
(< 4) `filter` ((+ 2) `map` [1,3,5])

В Scala то же самое можнозаписать следующим образом:

List(1,3,5) map (_ + 2)
// we can chain as follows:
List(1,3,5) map (_ + 2) filter (_ < 4)

Таким образом, порядок обратный, и мы принимаем функцию в качестве второго аргумента.В чем причина упорядочения аргументов в Haskell?

1 Ответ

6 голосов
/ 19 мая 2019

Это просто соглашение.Этот порядок в большинстве случаев более полезен, чем противоположный, потому что обычно от Data.List библиотеки вы скорее ожидаете утилит, которые позволят вам «преобразовать заданный список», чем «описать, как преобразовать некоторый фиксированный список».

Проверьте этот случай:

f :: [Int] -> [Int]
f = map (+1)

Здесь f Функция, которая увеличивает все элементы любого списка Int.Его можно назвать incrAll, и он будет звучать более гибко, чем

g :: (Int -> a) -> [a]
g f = map f [1,2,3] 

, который предназначен для работы с этим конкретным списком [1,2,3].Конечно, это может найти какое-то применение, но в целом оно менее вероятно.f после одного приложения - функция, которая «работает со списками».

Как я знаю, Scala вы можете написать что-то вроде f = _.map(incr), что намного лучше, чем (при условии flipmap = flip map) \l -> flipmap l incr или flip flipmap incr, но, к сожалению, Haskell не поддерживает этот вид сахара.Следующее, что в Scala map есть только один аргумент, и он «принадлежит» к какому-то списку, поэтому порядок очень похож на Haskell - разница в философии объективного и функционального подходов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...