Применение функции Haskell - PullRequest
       10

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

20 голосов
/ 05 декабря 2008

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

Ответы [ 2 ]

30 голосов
/ 05 декабря 2008

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

9 голосов
/ 07 декабря 2008

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

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

, возможно, помог бы вам увидеть, что происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...