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函数,以填充哈希方法,没有性能开销.

  • 我最喜欢的一个:`numberOfTrues :: [Bool] - > Int; numberOfTrues =长度.过滤id` (11认同)
  • 不是在这种情况下.严格性不会对功能构成产生任何影响. (2认同)
  • 另一个与此相关的例子是使用`id`作为Continuation Passing Style(CPS)中的基本函数. (2认同)

Con*_*nal 69

如果你操纵数字,特别是加法和乘法,你会注意到0和1的有用性.同样,如果你操纵列表,那么空列表就会变得非常方便.类似地,如果你操作函数(在函数式编程中非常常见),你会发现它的相同用途id.

  • 先生,我只读了一遍就了解了“ id”。谢谢。 (2认同)

Yit*_*itz 21

在函数式语言中,函数是可以作为参数传递的第一类值.因此id,当您将函数作为参数传递给另一个函数来告诉它该做什么时,会出现一个最常见的用法.做什么的选择之一可能是"只是不管它" - 在这种情况下,你id 作为参数传递.

  • “别管它”是让我点击的部分,谢谢! (3认同)

sig*_*fpe 6

假设您正在寻找某种解决方案,您可以在每个回合中进行移动.你从候选人的位置开始pos.在每个阶段都有一个可以进行转换的列表pos(例如,在拼图中滑动一块).在函数式语言中,将转换表示为函数是很自然的,现在您可以使用函数列表创建移动列表.如果"无所事事"是这个难题中的合法举措,那么你就可以代表那个id.如果你没有这样做,那么你需要处理"无所事事"作为一个与"做某事"不同的特殊情况.通过使用,id您可以在一个列表中统一处理所有情况.

这可能是几乎所有使用id存在的原因.用"做某事"统一处理"无所事事".