用于Haskell idfunction
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 :通过折叠构build函数:
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
我们通过用(.)
折叠函数列表来构build一个新的函数f
,使用id
作为基本情况。
例3 :作为monoids函数的基本情况(简化)。
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
的有用性。
在函数式语言中,函数是可以作为parameter passing的第一个类的值。 所以当你将一个函数作为parameter passing给另一个函数来告诉它该做什么时,就会出现id
最常见的用法之一。 做什么的select之一可能是“放弃它” – 在这种情况下,你通过id
作为参数。
假设你正在寻找某种解决方法来解决一个难题,那就是你在每一步都要做出一个动作。 你从候选职位pos
。 在每个阶段都有一个可能的变化列表(例如在拼图中滑动一块)。 在函数式语言中,将转换表示为函数是很自然的,所以现在可以使用函数列表来创build一个移动列表。 如果“无为而治”是一个合法的举动,那么你就可以用id
来表示。 如果你不这样做,那么你就需要把“无所事事”作为一种与“做某事”不同的特殊情况来处理。 通过使用id
你可以在一个列表中统一处理所有的情况。
这可能是为什么几乎所有的id
使用存在的原因。 用“做事”统一处理“无为”。
对于不同的答案:
当通过合成链接多个函数时,我经常会这样做:
foo = id . bar . baz . etc
过度
foo = bar . baz . etc
它使事情更容易编辑。 人们可以用其他“零”元素来做类似的事情,比如
foo = return >>= bar >>= baz foos = [] ++ bars ++ bazs
我也可以帮助提高你的高尔夫比分。 而不是使用
($)
你可以使用id保存一个字符。
例如
zipWith id [(+1), succ] [2,3,4]
一个有趣的,更有用的结果。
因为我们正在寻找很好的应用程序的id
。 在这里,有一个回文:)
import Control.Applicative pal :: [a] -> [a] pal = (++) <$> id <*> reverse
想象一下,你是一台电脑,即你可以执行一系列的步骤。 那么如果我想让你保持现在的状态,但我总是要给你一个指示(我不能只是静音,让时间过去),我给你什么指示? Id是为此创build的函数,用于返回参数不变(在前一个计算机的情况下,参数将是其状态)并为其命名。 这种必然性只有在具有高阶函数的情况下才会出现,而在不考虑内部函数的情况下使用函数进行操作时,这种必然性就会迫使您象征性地表示甚至是“无所作为”的实现。 类似地0被看作是一些东西的数量,是一个数量不存在的象征。 实际上,在代数中,0和id分别被认为是操作+和∘(函数成分)的中性元素,或者更正式地被认为是:
对于所有types号的x:
- 0 + x = x
- x + 0 = x
对于所有types的函数:
- id∘f = f
- f∘id = f
每当你需要在某个地方有一个function,但是要做的不仅仅是保持它的位置(以“未定义”为例)。
这也是很有用的,就像上面提到的斯图尔特博士(即将成为),因为当你需要将一个函数作为parameter passing给另一个函数时:
join = (>>= id)
或作为function的结果:
let f = id in f 10
(据推测,以后你会编辑上面的函数来做一些更有趣的事情……)
正如其他人所说的,当你需要某个function的时候, id
是一个很棒的地方。