【问题标题】:Need help understanding Haskell id function需要帮助理解 Haskell id 函数
【发布时间】:2021-12-06 10:22:13
【问题描述】:

您好,我有这个函数的两个版本,但遇到了一些问题。

iter :: Int -> (a -> a) -> (a -> a)
iter n f
  | n > 0 = f . iter (n-1) f
  | otherwise = id

iter' :: Int -> (a -> a) -> (a -> a)
iter' n = foldr (.) id . replicate n

即使在谷歌上搜索 id 在这里实际上做了什么之后,我也无法理解。

例如,如果我们使用n = 3 和f x = x+1 来处理函数。 当我们遍历整个 n 并到达 id 被调用时,我们的变量会发生什么?

我是一个非常大的新手,所以请您尽可能简单地解释一下。

【问题讨论】:

  • 这是一个有点复杂的表达方式,初学者一下子就明白了。也许离开一段时间,然后在一周左右回来。 id 不是问题:您可能很清楚这是由id x = x 定义的恒等函数。相反,您正在查看函数的递归组合,一开始很难理解。
  • id 是函数组合的标识,如(f . id) x == (id . f) x == f x,因此它与0 的作用相同,用于添加。比较 foldr (.) id 和 foldr (+) 0。

标签: haskell fold


【解决方案1】:

总结一个列表xs = [x1,x2,...,xn]可以可视化为

x1 + x2 + ... + xn + 0

请注意最后的+ 0。其目的是处理列表为空的情况,即xs = [] 和n=0。在这种情况下,上面的总和减少到0,这是一个空列表的正确总和。

还要注意,当列表不为空时,额外的+ 0 对总和没有影响,因此它是无害的。我们确实选择了0,因为它是添加的中性元素:x + 0 = x 代表所有x。

如果我们想计算一个产品,我们会写

x1 * x2 * ... * xn * 1

请注意末尾的* 1。它的作用与上面看到的+ 0 完全相同。另请注意,1 是乘法的中性元素:x * 1 = x 代表所有 x。

如果我们想计算函数列表的组成,我们会写

f1 . f2 . ... . fn . id

请注意末尾的. id。它的作用与上面看到的+ 0 和* 1 完全相同。另请注意,id 是所有 f 组合 f . id = f 的中性元素。

希望这将帮助您理解为什么,每次我们计算折叠时

x1 op x2 op ... op xn

其中op 是任何二元运算,我们希望以... op neutral_element 结尾,以便处理空列表情况,并且仍然作为非空列表的良好基础情况。

【讨论】:

    【解决方案2】:

    你可以内联:

    iter 3 f
    f . iter 2 f
    f . (f . iter 1 f)
    f . (f . (f . iter 0 f)
    f . (f . (f . id))
    
    -- adding the argument x
    iter 3 f x
    (f . (f . (f . id))) x
    -- using (g . h) x == g (h x)
    f ((f . (f . id)) x)
    f (f ((f . id) x))
    f (f (f (id x)))
    f (f (f x))
    

    在iter'的情况下:

    iter' 3 f
    (foldr (.) id . replicate 3) f
    foldr (.) id (replicate 3 f)
    foldr (.) id [f, f, f]
    (.) f (foldr (.) id [f, f]]
    (.) f ((.) f (foldr (.) id [f]))
    (.) f ((.) f ((.) f (foldr (.) id [])))
    (.) f ((.) f ((.) f id))
    f . (f . (f . id))
    

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 2021-12-26
      • 1970-01-01
      • 2012-01-18
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多