Я изучаю Haskell. Это тривиальный пример, но я хотел бы понять концепцию, почему я не могу использовать сопоставление шаблонов внутри лямбда-функции в следующем примере (т. Е. Почему функция filterfold работает, но filterfold) дает ошибку времени выполнения:Соответствие шаблону внутри lambda
-- Runs
filterfold' :: (a -> Bool) -> [a] -> [a]
filterfold' p zs = foldr (\y zs -> if (p y) then y:zs else zs) [] zs
-- Runtime error: Non-exhaustive patterns in lambda
filterfold :: (a -> Bool) -> [a] -> [a]
filterfold p (z:zs) = foldr (\y (z:zs) -> if (p y) then y:(z:zs) else (z:zs)) [] (z:zs)
Итак, zs из аргумента функции filterfold находится в области видимости, но вместо того, чтобы использовать 'z' из filterfold, он пытается выполнить локальное соответствие шаблона внутри лямбда? – Daniel
Да 'z' и' zs' внутри лямбда будут разными ('foldr' будет * предоставлять * их) - вот почему вы не должны повторно использовать имена параметров/аргументов для лямбда-аргументов - вы * вводите * те имена с ваш лямбда и скроет один раз из внешней области - поэтому, если вы хотите (повторно) использовать 'z' и' zs' из внешней области в 'filterfold', вы должны просто переименовать его в' foldr (\ y ys -> ...) '(или любое другое имя, отличное от' p', 'z',' zs' и 'y';)) – Carsten
, но обратите внимание: если вам действительно не нужен второй аргумент функцию (лямбда), которую вы даете 'foldr', то вам, вероятно, не нужно' foldr' в первую очередь, поскольку вы действуете только на 'head' списка, если это не пусто или не соответствует второму аргумент 'foldr' – Carsten