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