I think what you're missing is what you actually typed in the first case. This is a type error, it will not compile or run: chopEnds = init $ tail The $ operator can always be rewritten as parentheses, in this case: chopEnds = init (tail) Which has the same incorrectly typed meaning as: chopEnds = init tail The "result" you pasted looks equivalent to: chopEnds = init Perhaps this is what you typed? In this case the argument tail it will shadow the existing binding of the Prelude tail, which would be confusing so with -Wall it would issue a compiler warning: chopEnds tail = init $ tail <interactive>:2:10: warning: [-Wname-shadowing] This binding for ‘tail’ shadows the existing binding imported from ‘Prelude’ (and originally defined in ‘GHC.List’) On Mon, Jan 25, 2021 at 10:16 AM Lawrence Bottorff <borgauf@gmail.com> wrote:
I've got this
init $ tail [1,2,3] [2]
and this
chopEnds = init $ tail chopEnds [1,2,3] [1,2]
What happened? Why is it not just init $ tail [1,2,3] ?
This works fine
chopEnds2 = init . tail chopEnds2 [1,2,3] [2]
What am I missing?
LB _______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners