【问题标题】:Haskell: Explanation of function syntaxHaskell:函数语法解释
【发布时间】:2015-10-11 13:10:00
【问题描述】:

在这个定制版本的地图功能中,有一个“f”是几个点。我不确定 f 在函数中的含义(我是 Haskell 的初学者)。它与高阶函数有关吗?有人能解释一下 f 的含义,然后解释一下实际函数在做什么来创建地图功能吗?

map f [] = []
map f (a:b) = f a:map f b

【问题讨论】:

  • 在阅读函数的 Haskell 代码时,我强烈建议您从它的类型开始。例如,知道map 的参数类型可以极大地帮助理解。即使编译器可以自动推断出类型,大多数程序员仍然在代码中明确表示。

标签: haskell


【解决方案1】:

f 是一个函数,它是 map 函数的参数,因为 map 具有以下类型:

map :: (a -> b) -> [a] -> [b]

也就是说,从 a 到 b 的函数和 a 类型的元素列表,然后使用作为第一个参数传递的函数将列表(作为第二个参数传递)转换为 b 类型的元素列表使用函数(作为第一个参数传递)

这个函数对于遍历一个应用函数的列表非常有用。

假设我有一个数字列表

例如:

[2,3,4,5] 

如果我想为列表的每个元素添加 1,我可以使用 map 如下:

map (+1) [2,3,4,5]

或者,如果您更喜欢 lambda,请使用:

map (\x -> x+1) [2,3,4,5]

我们会得到答案:

[3,4,5,6]

所以在map的实现中

map f [] = []
map f (a:b) = f a:map f b

我们可以看到 f 是这个函数,用于通过将它应用于列表的每个元素来转换列表

实现是递归的,直到列表末尾逐个元素转换并将它们附加到列表中,因此列表的顺序与应用函数之前的顺序相同。

【讨论】:

    【解决方案2】:

    在您的map 定义中,f 是您提供给它的第一个参数。您的第一个模式匹配也可以使用 lambda 定义,以表示 where 参数来自:

    map f [] = -- ...
    map \f -> \[] -> -- ...
    

    在第二个定义中,您将递归 (:) 模式匹配的内容:

    map f (x:xs) = (f x) : (map f xs)
    

    我将f 应用到我们看到x 的第一个元素,然后前置导致map 的递归调用通过xs 的其余部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-11
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 2017-11-20
      相关资源
      最近更新 更多