用于Haskell id函数
Haskell中的id函数有哪些用途?
它作为高阶函数(以函数作为参数的函数)的参数很有用,您希望某些特定值保持不变。
示例1 :如果它处于Just中,则保留一个值,否则返回默认值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)
与我们的fold示例类似,函数可以被视为可连接的值,其中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
哈希表需要哈希函数。 但是如果你的密钥已经被散列了呢? 然后传递id函数,作为你的哈希方法填充,零性能开销。
如果你操纵数字,特别是加法和乘法,你会注意到0和1的有用性。同样,如果你操作列表,空列表变得非常方便。 同样,如果你操作函数(在函数式编程中很常见),你会注意到id
的相同用处。
在函数式语言中,函数是可以作为参数传递的第一类值。 所以当你将一个函数作为参数传递给另一个函数来告诉它该做什么时,就会出现id
最常见的用法之一。 做什么的选择之一可能是“放弃它” - 在这种情况下,你通过id
作为参数。