Haskell Prelude中'const'的含义是什么?
通过Haskell前奏,我看到一个函数 const
:
const x _ = x
我似乎无法find有关此function的任何相关信息。
重点是什么? 任何人都可以举一个例子来说明这个函数可以用在哪里?
当你不需要所有的灵活性时,传递给高阶函数是很有用的。 例如,一元序列运算符>>
可以用一元运算符定义
x >> y = x >>= const y
这比使用lambda有点整洁
x >> y = x >>= \_ -> y
而且你甚至可以免费使用它
(>>) = (. const) . (>>=)
虽然我不特别推荐在这种情况下。
为了增加hammar的优秀直接答案:像const
和id
这样的低级函数作为高阶函数是非常有用的,这与SKI combinator演算中的基本原理相同。
不是说我认为哈斯克尔的序曲function是在那个正式系统之后有意识地build模的。 在Haskell中创build丰富的抽象是非常容易的,所以你经常看到这些types的理论的东西出现实际上是有用的。
无耻的插件,但我博客了(->)
的应用程序实例实际上是这里的S
和K
组合器,如果这就是你所做的事情。
一个使用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包中看到这个工作。
当你抽象地开始目标,然后努力实现时,你会惊讶于答案。 也就是说,任何一个函数都可能像机器中的任何一个齿轮一样神秘。 但是,如果您拉回整个机器,您就可以了解该齿轮的使用环境。