Подтвердить что ты не робот

Использует функцию Haskell id

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

4b9b3361

Ответ 1

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

Пример 1. Оставьте значение в одиночку, если оно находится в порядке, иначе верните значение по умолчанию 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 служит для пустого случая, а (.) - как append.

Пример 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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Я часто это делаю, когда связывание нескольких функций с помощью композиции:

foo = id
  . bar
  . baz
  . etc

над

foo = bar
  . baz
  . etc

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

foo = return
  >>= bar
  >>= baz

foos = []
  ++ bars
  ++ bazs

Ответ 6

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

($)

вы можете сохранить один символ с помощью id.

например.

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

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

Ответ 7

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

import Control.Applicative

pal :: [a] -> [a]
pal = (++) <$> id <*> reverse

Ответ 8

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

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

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

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

  • id ∘ f = f
  • f ∘ id = f

Ответ 9

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

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

join = (>>= id)

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

let f = id in f 10

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

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