2016-08-20 68 views
2

身份識別功能的用途是什麼?它只是返回相同的值。因此,不要把(identity x),而是簡單地把x?有人能舉出一些在球拍/方案中使用身份識別功能的例子嗎?有這些文檔頁面上沒有例子:https://docs.racket-lang.org/htdp-langs/beginner.html#%28def.htdp-beginner.%28%28lib._lang%2Fhtdp-beginner..rkt%29.identity%29%29https://docs.racket-lang.org/reference/procedures.html?q=identity#%28def.%28%28lib._racket%2Ffunction..rkt%29._identity%29%29球拍中的身份識別功能有什麼用?

+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?noredirect=1&lq=1 – Thilo

+0

同樣可以問關於常量函數;)。 – Alexey

回答

7

identity功能是作爲參數傳遞給某些高階函數(功能,這取函數作爲參數)時的功能執行特定排序映射由定製最有用它的論點,而你希望通過不變的方式來傳遞價值。 †方案

一個非常常見的成語/球拍是用(filter identity ...)從列表中刪除所有#f值:

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

這工作,因爲filter應用所提供的功能,每一個列表的元素,然後丟棄導致#f的值。通過使用identity,值本身被檢查。在這個意義上,identity是功能性的「禁用」。

有時候你可以看到這個成語拼寫(filter values ...)而不是(filter identity ...)因爲values發生在一個參數設置成身份的功能,它來自racket/base而不是racket/function。不過,我更喜歡明確使用identity的版本,因爲我認爲它會更清楚一點。


†身份功能的這一描述來自this nice answer爲Haskell的等效問題。

+0

有無論如何傳遞#f而不是標識功能? – X10D

+0

@ X10D不,沒有。你爲什麼想這麼做? –