[Haskell-cafe] defining last using foldr

Alexteslin alexteslin at yahoo.co.uk
Wed Aug 15 16:24:52 EDT 2007




Aaron Denney wrote:
> 
> (Quoting reformatted.  Try to have your responses below what you are
> responding to.  It makes it easier to read as a conversation.)
> 
> On 2007-08-14, Alexteslin <alexteslin at yahoo.co.uk> wrote:
>> Aaron Denney wrote:
>>> Folds replace the "cons" operator (:) with the function you pass it.
>>> If you want the tail of the list, you want what is on the right hand
>>> side of every cons (unless that's []).
> 
>>
>> Well, i have tried cons (:) operator but when it passed to foldr doesn't
>> work
>> because cons operator operates first character and then the list but the
>> foldr argument takes a function (a->a->a).  Maybe i am missing the point
>> here?
> 
> I didn't say to use (:), I said foldr works by replacing (:) with some
> other function.
> 
> foldr also takes a function of type (a -> b -> b).
> 
> foldr f e 
> replaces
> (first : (middle : (last : [])))
> with
> (first `f` (middle `f` (last `f` e)))
> 
> You want last to be kept, so 
> f x e = x
> 
> this causes the overall pattern to reduce to
> (first `f` (middle `f` last))
> 
> This time you need
> f y last = last
> 
> This means you need to discriminate between "e" and "last".
> 
> If you make "e" the same type as last, you could accidentally compare
> them equal.  So instead of using the same type, we want one with one
> more value.  There is a standard one: "Maybe a", with constructors
> "Just a" and "Nothing".  And you also need to promote last to this
> type with the constructor Just, because the result gets fed in on the
> right.
> 
> -- 
> Aaron Denney
> -><-
> 
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
> 
> 

I am really sorry, but i still can't define the function.  The chapter the
exercise is in precedes algebraic types or Maybe a types.  And is seems that
must being easy to define. 
I answered some exercises on using foldr such as summing for example, but
this one i am trying:

myLast :: [Int] -> Int
myLast (x:xs) = foldr (some function) x xs.  

With summing as i understood foldr goes through the list and sums up by (+)
operator and one argument like 0.  Like: foldr (+) 0 xs

-- 
View this message in context: http://www.nabble.com/defining-last-using-foldr-tf4269357.html#a12169661
Sent from the Haskell - Haskell-Cafe mailing list archive at Nabble.com.



More information about the Haskell-Cafe mailing list