Map是具有两个参数的函数吗?

时间:2014-05-24 12:36:59

标签: haskell

我正在尝试解决一个多项选择问题,该问题说明了以下内容

  • map是一个重载函数
  • map是一个多态函数
  • map是一个curried函数
  • map是一个高阶函数
  • map是一个带有两个参数的函数

我知道地图是重载的,多态的,咖喱的和高阶的。这是否意味着map只是一个参数的函数? (我意识到这是函数被curry的结果,而haskell只有具有单个参数的函数,多个参数函数通过currying和部分应用程序应用)

推理是否正确?如果是这样,map函数如何通过部分应用程序评估函数?

3 个答案:

答案 0 :(得分:3)

与所有Haskell函数一样,map是单参数函数。我们来看看它的类型签名:

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

相当于:

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

我认为在你的情况下这个签名更容易理解:map得到一个参数 - 一个从ab的函数 - 并返回另一个函数,这次从{{1转到[a]

Essentialy,[b]“提升”一个函数 - 它需要一个常规函数并“提升”它以便它可以在列表上运行。 lifting的这个想法出现在Haskell的几个地方。

例如,map是从evenInt的函数 - 它接受一个数字,如果是偶数则返回true。 Boolmap even[Int]的函数 - 它接受一个数字列表并返回一个布尔值列表。 [Bool]只是map even在不同的“上下文”中工作 - 列表而不是单个值。

答案 1 :(得分:1)

你可以说map有两个参数,但实际上Haskell中的每个函数只接受一个参数。检查它的类型:

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

所以map似乎根据它的类型定义采用两个参数。但是由于curring发生在Haskell中,你可以说它需要(a -> b)类型的参数并返回[a] -> [b]。因为讨好你可以做这样的事情,其中​​一个参数作为一个参数,并没有抛出编译错误:

λ> let a = map (+ 3)

知道curring如何使任何函数获取一个参数并返回一个参数并理解任何函数的一般类型定义以查看它需要什么之间的区别。由于currying,Haskell中的每个函数实际上只接受一个参数。

答案 2 :(得分:1)

原始问题来自https://www.edx.org/course/introduction-functional-programming-delftx-fp101x-0

练习:

关于Prelude功能图的以下哪些陈述::(a - > b) - > [a] - > [b]是假的:

“map是一个带有两个参数的函数”

“地图是一个重载的功能”

...

实际上他们同意“map是一个重载函数”是False,因此“map是一个带有两个参数的函数”变为True。