Haskell 中 id function 有哪些用途?

最佳答案

它作为 higher order functions(将函数作为参数的函数)的参数很有用,您希望某些特定值保持不变。

示例 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 用于空情况,(.) 作为附加。

示例 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

哈希表需要哈希函数。但是如果你的 key 已经被散列了怎么办?然后传递 id 函数,填充为您的散列方法,性能开销为零。

关于function - Haskell id 函数的用途,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3136338/

10-14 17:11
查看更多