2016-08-20 2 views
2

Что такое функция идентификации? Он просто возвращает одно и то же значение. Следовательно, вместо того, чтобы поставить (identity x), почему бы просто не поставить x? Может ли кто-нибудь привести примеры использования функции идентификации в Racket/Scheme? Там нет примеров на этой странице документации: https://docs.racket-lang.org/htdp-langs/beginner.html#%28def.htdp-beginner.%28%28lib._lang%2Fhtdp-beginner..rkt%29.identity%29%29 и https://docs.racket-lang.org/reference/procedures.html?q=identity#%28def.%28%28lib._racket%2Ffunction..rkt%29._identity%29%29Какое использование функции идентификации в Racket?

+0

Есть несколько связанных вопросов об использовании функции идентификации на других языках, идея, вероятно, такая же, см., Например, http://stackoverflow.com/questions/3136338/uses-for-haskell-id-function или http://stackoverflow.com/questions/15421502/is-there-any-good-example-of-use-cases-for-angular-identity?noredirect11&lq=1 – Thilo

+0

То же самое можно задать о постоянных функциях;). – Alexey

ответ

7

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

Один чрезвычайно общей идиомы на схеме/Ракетка использует (filter identity ...), чтобы удалить все #f значения из списка:

> (filter identity '(1 2 #f 4)) 
'(1 2 4) 

Это работает, потому что filter применяет предоставленную функцию к каждому из элементов списка , затем отбрасывает значения, которые приводят к #f. Используя identity, сами значения проверены. В этом смысле identity является функциональным «no-op».

Вы можете иногда увидеть это идиома пишется (filter values ...) вместо (filter identity ...) потому что values случается тождественную функцию при условии, с одним аргументом, и это происходит из racket/base вместо racket/function. Я предпочитаю версию, которая использует identity явно, хотя, потому что я думаю, что немного более понятно, что происходит.


† Это описание функции идентичности происходит от this nice answer на эквивалентный вопрос Haskell.

+0

в любом случае передать #f вместо функции idenity? – X10D

+0

@ X10D Нет, нет. Почему вы хотите это сделать? –

Смежные вопросы