2012-11-30 1 views
0

Я начал изучать Haskell, и я есть проблемы с пониманием, как декартово произведение списков в списке работдоперли как декартово реализация продукта на Haskell работы

здесь предполагаемый код

cprod = foldr f [[ ]] 
     where f xs yss = foldr g [ ] xs 
      where g x zss = foldr h zss yss 
        where h ys uss = (x : ys) : uss 

Что именно я не получаю это последняя функцию я заменил имена переменных, как я понимаю

mycart = foldr f [[]] 
    where f currentresult listelem = foldr g [] currentresult 
      where g currentresultonstep currentresultelem = foldr h currentresultelem listelem 
       where h currentresultelemonstep onelistelem = (currentresultonstep:currentreslteleemonstep):onelistelem 

не должна быть последняя строки что-то вроде этого?

where h currentresultelemonstep onelistelem = (onelistelem:currentresultelemonstep):currentresultonstep 

, как мы стараемся, чтобы добавить элементы списка в начале на элементы текущего результата ?

ответ

3

Во-первых, ваш код, как написано не синтаксически действует:

foo.hs:3:13: parse error on input `where' 

Во-вторых, кажется, что вы смущены о порядке аргументов в первом параметре foldr:

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

Первый аргумент (a) является элементом списка ввода ([a]), вторым аргументом (b) является аккумулятор.

+0

когда я пишу 'где f x y', для foldr, y - это аккумулятор? – Herokiller

+0

Да, и x - текущий элемент. – melpomene

+0

ах, как получилось, я подумал, что первый параметр - это аккумулятор, спасибо – Herokiller