Haskell Prelude中'const'的含义是什么?

通过Haskell前奏,我看到一个函数 const

 const x _ = x 

我似乎无法find有关此function的任何相关信息。

重点是什么? 任何人都可以举一个例子来说明这个函数可以用在哪里?

当你不需要所有的灵活性时,传递给高阶函数是很有用的。 例如,一元序列运算符>>可以用一元运算符定义

 x >> y = x >>= const y 

这比使用lambda有点整洁

 x >> y = x >>= \_ -> y 

而且你甚至可以免费使用它

 (>>) = (. const) . (>>=) 

虽然我不特别推荐在这种情况下。

为了增加hammar的优秀直接答案:像constid这样的低级函数作为高阶函数是非常有用的,这与SKI combinator演算中的基本原理相同。

不是说我认为哈斯克尔的序曲function是在那个正式系统之后有意识地build模的。 在Haskell中创build丰富的抽象是非常容易的,所以你经常看到这些types的理论的东西出现实际上是有用的。

无耻的插件,但我博客了(->)的应用程序实例实际上是这里的SK组合器,如果这就是你所做的事情。

一个使用const简单例子是Data.Functor.(<$) 。 有了这个函数,你可以说:我在这里有一个无聊的东西,但是我想在其中有其他有趣的东西,而不改变函子的形状。 例如

 import Data.Functor 42 <$ Just "boring" --> Just 42 42 <$ Nothing --> Nothing "cool" <$ ["nonsense","stupid","uninteresting"] --> ["cool","cool","cool"] 

定义是:

 (<$) :: a -> fb -> fa (<$) = fmap . const 

或写成不是毫无意义的:

 cool <$ uncool = fmap (const cool) uncool 

你会看到const在这里用来“忘记”input。

另一个用途是实现具有虚拟参数的类成员函数,该参数不应被评估(用于parsing不明确的types)。 可以在Data.bits中的例子:

 instance Bits Int where isSigned = const True bitSize = const wordSize ... 

通过使用const我们明确地说,我们正在定义常量值。

就个人而言,我不喜欢使用虚拟参数,但是如果它们被用在一个类中,那么这是写实例的一种相当不错的方式。

我似乎无法find有关此function的任何相关信息。

许多其他答案讨论相对深奥(至less对新来的)应用程序的const 。 下面是一个简单的例子:你可以使用const去掉一个带有两个参数的lambdaexpression式,抛出第一个参数,但是对第二个参数做一些有趣的事情。

例如,以下(低效!)实现的length

 length' = foldr (\_ acc -> 1 + acc) 0 

可以改写为

 length' = foldr (const (1+)) 0 

这也许更优雅。

expression式const (1+)确实等价于\_ acc -> 1 + acc ,因为它接受一个参数,将其抛出,并返回section (1+)

const可能只是你正在寻找的其他function的实现。 这是我发现的一个例子。

假设我们想要将2元组的结构重写为2元组的另一个结构。 我可以这样expression:

 ((a,b),(c,d)) ⇒ (a,(c,(5,a))) 

我可以用模式匹配给出一个直接的定义:

 f ((a,b),(c,d)) = (a,(c,(5,a))) 

如果我想要一个毫无意义的(默认)解决scheme来完成这种重写呢? 稍后的一些想法和摆弄,答案是我们可以用(&&&), const, (.), fst, snd来expression任何重写。 请注意(&&&)来自Control.Arrow

使用这些函数的例子的解决scheme是:

 (fst.fst &&& (fst.snd &&& (const 5 &&& fst.fst))) 

注意与(a,(c,(5,a)))的相似性。 如果我们用&replace&&& ,怎么办? 然后它写道:

 (fst.fst, (fst.snd, (const 5, fst.fst))) 

注意a是第一个元素的第一个元素,这就是fst.fst项目。 注意c是第二个元素的第一个元素,这就是fst.snd项目。 也就是说,variables成为他们来源的途径。

const允许我们引入常量。 有趣的名字如何与意义联系起来!

然后我用Applicative概括了这个想法,这样你就可以用毫无意义的方式编写任何函数(只要你有作为函数的可用的案例分析,例如bool )。 const又一次扮演了引入常量的angular色。 你可以在Data.Function.Tacit包中看到这个工作。

当你抽象地开始目标,然后努力实现时,你会惊讶于答案。 也就是说,任何一个函数都可能像机器中的任何一个齿轮一样神秘。 但是,如果您拉回整个机器,您就可以了解该齿轮的使用环境。