Использование для идентификационной функции Haskell

Которые являются использованием для идентификационной функции в Haskell?

59
задан fjsj 28 June 2010 в 21:39
поделиться

6 ответов

Это полезно в качестве аргумента для функций высшего порядка (функций, которые принимают функции в качестве аргументов), где вы хотите, чтобы какое-то конкретное значение оставалось неизменным.

Пример 1 : оставьте значение в покое, если оно находится в Just, в противном случае верните значение по умолчанию 7.

Prelude Data.Maybe> :t maybe
maybe :: b -> (a -> b) -> Maybe a -> b

Prelude Data.Maybe> maybe 7 id (Just 2)
2

Пример 2 : создание функции через свертку:

Prelude Data.Maybe> :t foldr (.) id [(+2), (*7)]
:: (Num a) => a -> a

Prelude Data.Maybe> let f = foldr (.) id [(+2), (*7)]

Prelude Data.Maybe> f 7
51

Мы построили новая функция f путем сворачивания списка функций вместе с (.) , используя id в качестве базового случая.

Пример 3 : базовый случай для функций как моноидов (упрощенный).

instance Monoid (a -> a) where
        mempty        = id
        f `mappend` g = (f . g)

Подобно нашему примеру со сверткой, функции можно рассматривать как конкатенируемые значения, при этом id служит для пустого случая, а (.) - как добавляемое.

Пример 4 : тривиальная хеш-функция.

Data.HashTable> h <- new (==) id :: IO (HashTable Data.Int.Int32 Int)

Data.HashTable> insert h 7 2

Data.HashTable> Data.HashTable.lookup h 7
Just 2

Для хеш-таблиц требуется функция хеширования. Но что, если ваш ключ уже хеширован? Затем передайте функцию id для заполнения в качестве метода хеширования с нулевыми накладными расходами на производительность.

81
ответ дан 24 November 2019 в 18:01
поделиться

Если вы манипулируете числами, особенно с помощью сложения и умножения, вы заметите полезность 0 и 1. Точно так же, если вы манипулируете списками, пустой список оказывается весьма удобным. Точно так же, если вы манипулируете функциями (очень часто в функциональном программировании), вы заметите такую ​​же полезность id .

69
ответ дан 24 November 2019 в 18:01
поделиться

Для другого типа ответа:

Я часто делаю это при объединении нескольких функций в цепочку с помощью композиции:

foo = id
  . bar
  . baz
  . etc

вместо

foo = bar
  . baz
  . etc

Это упрощает редактирование. Аналогичные действия можно делать и с другими «нулевыми» элементами, такими как

foo = return
  >>= bar
  >>= baz

foos = []
  ++ bars
  ++ bazs
3
ответ дан 24 November 2019 в 18:01
поделиться

В функциональных языках функции являются значениями первого класса. который вы можете передать в качестве параметра. Таким образом, одно из наиболее распространенных применений id возникает, когда вы передаете функцию как параметр другой функции, чтобы сообщить ей, что делать. Один из вариантов, что делать, скорее всего, будет "просто оставьте это в покое" - в этом случае вы передаете id в качестве параметра.

21
ответ дан 24 November 2019 в 18:01
поделиться

Предположим, вы ищете какое-то решение головоломки, в которой вы делаете ход на каждом ходу. Вы начинаете с позиции кандидата pos . На каждом этапе есть список возможных преобразований, которые вы можете сделать в pos (например, сдвинуть кусок головоломки). На функциональном языке естественно представлять преобразования как функции, поэтому теперь вы можете составить список ходов, используя список функций. Если «ничего не делать» является допустимым ходом в этой головоломке, то вы должны представить это с помощью id . Если вы этого не сделали, вам нужно было бы рассматривать «ничего не делать» как особый случай, который работает иначе, чем «делать что-то». Используя id , вы можете обрабатывать все случаи единообразно в одном списке.

Это, вероятно, причина того, что почти все варианты использования id существуют. Управлять «ничего не делать» единообразно и «делать что-то».

6
ответ дан 24 November 2019 в 18:01
поделиться

Всякий раз, когда вам нужно где-то разместить функцию, но вы хотите сделать больше, чем просто сохранить ее место (на примере 'undefined').

Это также полезно, как (скоро будущий) доктор Стюарт упомянул выше, когда вам нужно передать функцию как аргумент другой функции:

join = (>>= id)

или как результат функции:

let f = id in f 10

(предположительно, вы отредактируете вышеприведенную функцию позже, чтобы сделать что-то более "интересное"... ;)

Как уже упоминали другие, id - замечательный держатель места, когда вам нужна функция где-то.

0
ответ дан 24 November 2019 в 18:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: