2016-04-04 2 views
1

Приведенный ниже код используется для создания пересечения двух списков:Haskell foldr и foldl

unionSet :: Eq a => [a] -> [a] -> [a] 
unionSet a b = foldl (\acc x -> if elem x acc then acc else acC++ [x]) a b 

Почему foldl функция работает, но когда я использую foldr он генерирует ошибки?

+0

1. Вы не можете «пересечь два списка». Вы можете пересечь множества. В вашем коде упоминается «союз», а не «пересекается». Вы можете использовать списки для представления множеств. Но вы не должны, большую часть времени. 2. «код не работает» - более конкретный. Ошибка синтаксиса? Ошибка типа? Ошибка семантики (вы получаете результат, но это неправильно)? В последнем случае также включается спецификация (в которой говорится, что правильно). – d8d0d65b3f7cf42

+0

Возможный дубликат [foldl/foldr query] (http://stackoverflow.com/questions/6050306/foldl-foldr-query) – Bakuriu

ответ

6

foldr имеет тип

(a -> b -> b) -> [a] -> b -> b 

в то время как foldl имеет тип

(b -> a -> b) -> [a] -> b -> b 

Обратите внимание на порядок этих двух параметров.

(\x acc -> ... 

исправит ошибку.

+1

Это сделано, чтобы сделать более понятным, к какому приказу применяется оператор. – PyRulez

Смежные вопросы