我正在尝试解决一个多项选择问题,该问题说明了以下内容
我知道地图是重载的,多态的,咖喱的和高阶的。这是否意味着map只是一个参数的函数? (我意识到这是函数被curry的结果,而haskell只有具有单个参数的函数,多个参数函数通过currying和部分应用程序应用)
推理是否正确?如果是这样,map函数如何通过部分应用程序评估函数?
答案 0 :(得分:3)
与所有Haskell函数一样,map
是单参数函数。我们来看看它的类型签名:
map :: (a -> b) -> [a] -> [b]
相当于:
map :: (a -> b) -> ([a] -> [b])
我认为在你的情况下这个签名更容易理解:map
得到一个参数 - 一个从a
到b
的函数 - 并返回另一个函数,这次从{{1转到[a]
。
Essentialy,[b]
“提升”一个函数 - 它需要一个常规函数并“提升”它以便它可以在列表上运行。 lifting的这个想法出现在Haskell的几个地方。
例如,map
是从even
到Int
的函数 - 它接受一个数字,如果是偶数则返回true。 Bool
是map 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。