身份功能有什么用?它只返回相同的值.因此,(identity x)为什么不简单地放x?有人可以举一些在Racket/Scheme中使用身份功能的例子吗?这些文档页面上没有示例:https://docs.racket-lang.org/htdp-langs/beginner.html#%28def.HTDP-初学者.%28%28lib._lang%2Fhtdp-beginner..rkt%29.身份%29%29 和 https://docs.racket-lang.org/reference/procedures.html?q=identity#%28def.%28%28lib._racket%2Ffunction..rkt%29._identity%29%29
identity当函数执行由其参数定制的某种映射时,该函数主要用作某些高阶函数(将函数作为参数的函数)的参数,并且您希望通过未更改的值传递该值.†
Scheme/Racket中一个非常常见的习惯用法是从列表中(filter identity ...)删除所有#f值:
> (filter identity '(1 2 #f 4))
'(1 2 4)
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为filter将提供的函数应用于列表的每个元素,然后丢弃导致的值#f.通过使用identity,检查值本身.从这个意义上讲,identity功能是"无操作".
你有时可能会看到这个成语拼写(filter values ...)而不是(filter identity ...)因为values当提供一个参数时碰巧是身份函数,它来自racket/base而不是racket/function.我更喜欢identity明确使用的版本,因为我认为发生的事情有点清楚.
†身份函数的这种描述来自Haskell等效问题的这个很好的答案.