用于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是一个很棒的地方。