2017-02-20 9 views
1

Я прокладываю себе путь через Haskell book, и я немного озадачен складками. Одно упражнение просит читателя написать функцию elem с помощью foldr. Я не мог опустить голову и придумал пример, который я сейчас пытаюсь понять. Тип подпись для foldr является:Что такое лямбда в этом складном деле?

foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b 

пример функции я нашел:

myElem' :: Eq a => a -> [a] -> Bool 
myElem' a = foldr (\x y -> a == x || y) False 

Я понимаю, что (\x y -> a == x || y) производящего (a -> b -> b) части типа, False производящий b и t a является подразумевается в стиле, свободном от точек.

Но сама лямбда сейчас кажется магией. Я читаю его как функцию x с одним параметром y, проверит, x(y) == a, с элементом, поставленным в качестве аргумента myElem', и верните True или исходный аргумент в x. Это явно чепуха. Где я иду не так?

+0

Lambdas являются анонимными. 'x' - это не имя функции, а один из аргументов. – duplode

ответ

3

\x y -> a == x || y - это функция с двумя параметрами, называемая x и y. Он возвращает True всякий раз, когда a == x является True или y является True.

+1

, возможно, это немного легче увидеть с явной партизацией '\ x y -> (a == x) || y' – epsilonhalbe

+1

Хорошо, так же как и 'y' только скопированное значение складки и' x', когда структура структуры складывается? –

+0

@GarryCairns У вас это есть. –