1

I'm trying to understand how Haskell evalutes sep [1, 2, 3, 4, 5] to get ([1, 3], [2, 4, 5]) where:

sep [ ] = ([ ], [ ])
sep [x] = ([ ], [x])
sep (x1:x2:xs) = let (is, ps) = sep xs in (x1:is, x2:ps)

I start like this:

sep [1, 2, 3, 4, 5] = let (is, ps) = sep [3, 4, 5] in (1:is, 2:ps)

but then?

duplode
  • 33,731
  • 7
  • 79
  • 150
Fof
  • 407
  • 2
  • 8
  • 2
    next step is to match `sep [3, 4, 5]` with `sep (x1:x2:xs) = ...` – ymonad Apr 22 '14 at 23:45
  • Ok, so. 1) sep [1, 2, 3, 4, 5] = let (is, ps) = sep [3, 4, 5] in (1:is, 2:ps) 2) sep [3, 4, 5] = let (is, ps) = sep [5] in (3:is, 4:ps) 3) sep [5] = ([], [5]) In 2) sep [3, 4, 5] = let (is, ps) = ([], [5]) in (3:is, 4:ps). Any idea in how to continue? – Fof Apr 22 '14 at 23:58

1 Answers1

4

Finally I understood.

1) sep [1, 2, 3, 4, 5] = let (is, ps) = sep [3, 4, 5] in (1:is, 2:ps)

2) sep [3, 4, 5] = let (is, ps) = sep [5] in (3:is, 4:ps)

3) sep [5] = ([], [5])

In 2) sep [3, 4, 5] = let (is, ps) = ([], [5]) in (3:is, 4:ps) = ([3], [4, 5])

In 1) sep [1, 2, 3, 4, 5] = let (is, ps) = ([3], [4, 5]) in (1:is, 2:ps) = ([1, 3], [2, 4, 5])

Fof
  • 407
  • 2
  • 8