Don*_*art 81
它作为高阶函数(将函数作为参数的函数)的参数有用,您希望某些特定值保持不变.
示例1:如果它在Just中,则单独保留一个值,否则返回默认值7.
Prelude Data.Maybe> :t maybe
maybe :: b -> (a -> b) -> Maybe a -> b
Prelude Data.Maybe> maybe 7 id (Just 2)
2
Run Code Online (Sandbox Code Playgroud)
示例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
Run Code Online (Sandbox Code Playgroud)
我们建立了一个新的功能,f
通过折叠功能的列表一起(.)
使用id
的基本情况.
例3:作为幺半群的函数的基本情况(简化).
instance Monoid (a -> a) where
mempty = id
f `mappend` g = (f . g)
Run Code Online (Sandbox Code Playgroud)
与我们的折叠示例类似,函数可以被视为可连接值,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
Run Code Online (Sandbox Code Playgroud)
哈希表需要散列函数.但是,如果你的密钥已经被散列怎么办?然后传递id函数,以填充哈希方法,没有性能开销.
Con*_*nal 69
如果你操纵数字,特别是加法和乘法,你会注意到0和1的有用性.同样,如果你操纵列表,那么空列表就会变得非常方便.类似地,如果你操作函数(在函数式编程中非常常见),你会发现它的相同用途id
.
Yit*_*itz 21
在函数式语言中,函数是可以作为参数传递的第一类值.因此id
,当您将函数作为参数传递给另一个函数来告诉它该做什么时,会出现一个最常见的用法.做什么的选择之一可能是"只是不管它" - 在这种情况下,你id
作为参数传递.
假设您正在寻找某种解决方案,您可以在每个回合中进行移动.你从候选人的位置开始pos
.在每个阶段都有一个可以进行转换的列表pos
(例如,在拼图中滑动一块).在函数式语言中,将转换表示为函数是很自然的,现在您可以使用函数列表创建移动列表.如果"无所事事"是这个难题中的合法举措,那么你就可以代表那个id
.如果你没有这样做,那么你需要处理"无所事事"作为一个与"做某事"不同的特殊情况.通过使用,id
您可以在一个列表中统一处理所有情况.
这可能是几乎所有使用id
存在的原因.用"做某事"统一处理"无所事事".