21

有点像 Haskell 新手的问题,但我在 Haskell 的教程示例中遇到了这个示例。对于“查找列表的最后一个元素”,有一些明显的版本,比如

last' [x] = x
last' (_:xs) = last' xs

但我无法理解呈现的替代版本:

myLast' = foldr1 (const id)

因此,为了理解 id 函数的应用程序在做什么,我在 ghci 中进行了尝试:

const id 1 2 -> gives 2

这像这样绑定:

(const id) 1 2 -> gives 2

而不是这样:

 const (id 1) 2 -> gives 1 

但我不明白这一点。(const id)应该翻译成类似的东西

`(\x y->x) (\x->x)` 

这不应该返回一个简单地返回其第一个元素的 id 的函数吗?或者,函数顺序生成 (const id) 的行为与 const 有何不同?

4

2 回答 2

31

的定义const

const x = \_ -> x

因此,(const id)是一个函数,它接受一个参数并始终返回id并且

const id 1 2 = (\_ -> id) 1 2
             = id 2
             = 2

的定义foldr1

foldr1 f [x] = x
foldr1 f (x:xs) = f x (foldr1 f xs)

如果我们有

myLast' = foldr1 (const id)

然后

myLast' [x] = foldr1 (const id) [x]
              {- definition of foldr1 -}
            = x

myLast' (x:xs) = foldr1 (const id) (x:xs)
                 {- definition of foldr1 -}
               = (const id) x (foldr1 (const id) xs)
                 {- definition of const -}  
               = (\_ -> id) x (foldr1 (const id) xs)
                 {- function application -}  
               = id (foldr1 (const id) xs)
                 {- definition of id -}  
               = foldr1 (const id) xs
                 {- definition of myLast' -}  
               = myLast' xs

与 的定义一致last'

于 2008-12-05T06:16:06.750 回答
9

:t在尝试理解 Haskell 时,我非常依赖。在这种情况下:

Prelude> :t const id
const id :: b -> a -> a

可能会帮助您了解发生了什么。

于 2008-12-07T20:49:58.497 回答