Используется для функции Haskell ID - PullRequest
58 голосов
/ 29 июня 2010

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

Ответы [ 9 ]

80 голосов
/ 29 июня 2010

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

Пример 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 для заполнения в качестве метода хеширования с нулевыми накладными расходами.

69 голосов
/ 29 июня 2010

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

20 голосов
/ 29 июня 2010

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

6 голосов
/ 30 июня 2010

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

Это, вероятно, причина, по которой существует почти все случаи использования id.Равномерно относиться к «бездействию» с «что-то делать».

3 голосов
/ 26 октября 2016

Представьте, что вы компьютер, то есть вы можете выполнить последовательность шагов.Тогда, если я хочу, чтобы вы оставались в вашем текущем состоянии, но я всегда должен давать вам инструкции (я не могу просто отключить звук и позволить времени пройти), какую инструкцию я вам даю?Id - это функция, созданная для этого, для возврата аргумента без изменений (в случае предыдущего компьютера аргумент был бы его состоянием) и для наличия имени для него.Эта необходимость возникает только тогда, когда у вас есть функции высокого порядка, когда вы работаете с функциями без учета того, что находится внутри них, что заставляет вас символически представлять даже реализацию «ничего не делать».Аналогично 0, рассматриваемый как количество чего-либо, является символом отсутствия количества.На самом деле в алгебре и 0, и id считаются нейтральными элементами операций + и ∘ (состав функции) соответственно, или более формально:

для всех x типа номер:

  • 0 + x = x
  • x + 0 = x

для всех функций типа f:

  • id ∘ f = f
  • f ∘ id = f
3 голосов
/ 25 июля 2012

Так как мы находим хорошие приложения id.Здесь есть палиндром:)

import Control.Applicative

pal :: [a] -> [a]
pal = (++) <$> id <*> reverse
3 голосов
/ 17 августа 2011

Я также могу помочь улучшить ваш счет в гольфе.Вместо использования

($)

вы можете сохранить один символ, используя идентификатор.

например,

zipWith id [(+1), succ] [2,3,4]

Интересный, более чем полезный результат.

3 голосов
/ 29 июня 2010

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

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

foo = id
  . bar
  . baz
  . etc

over

foo = bar
  . baz
  . etc

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

foo = return
  >>= bar
  >>= baz

foos = []
  ++ bars
  ++ bazs
0 голосов
/ 01 июля 2010

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

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

join = (>>= id)

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

let f = id in f 10

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

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

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