Подтвердить что ты не робот

Применение функции Haskell

Немного неофитского вопроса 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)` 

Не следует ли возвращать функцию, которая просто возвращает идентификатор своего первого элемента? Или, как порядок выполнения функции (const id) ведет себя иначе, чем const?

4b9b3361

Ответ 1

Определение 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'.

Ответ 2

В попытке понять Haskell я сильно полагаюсь на :t. В этом случае:

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

может помочь вам понять, что происходит.