[Haskell-beginners] Re: Function composition with more than 1 parameter
Daniel Fischer
daniel.is.fischer at web.de
Sat Oct 25 10:39:23 EDT 2008
Am Samstag, 25. Oktober 2008 15:57 schrieb Glurk:
> > > I'm using WinHugs - do you get them to work in some other environment ?
> >
> > Did you give a type signature for these?
> > Then you would of course have to include the context Eq b, since (==) is
>
> used.
>
> > If you don't give any type signatures, all above versions should work in
> > all environments, otherwise it would be a serious bug.
>
> OK, now I'm getting somwhere ! :)
>
> I tried it with GHCi, and it works !
> ...but only after disabling the monomorphism restriction !
Oh yes, the dreaded MR I forgot.
> It offered another alternative, which was to give a type definition.
>
> So, I tried :-
>
> matches :: Eq a => a -> [a] -> [a]
> matches = filter . (==)
>
> hm :: Eq a => a -> [a] -> Int
> hm = (length .) . matches
>
> in Hugs, and that also worked :)
>
> I'm still struggling to come to grips with how it is actually working...
> I was thinking that this pointfree style was to make things simpler, more
> readable and understandable...but now I'm not so sure !
Sometimes pointfree style is clearer and more readable, sometimes it makes
things obscure.
Get some experience writing both, pointfree and pointful versions, to develop
a feeling when to write pointfree and when not (and when to use mixed style,
e.g. "hm x = length . matches x" might be clearer).
>
> If it's not a simple case (f.g.h etc) I might just stick with putting the
> parameter names in. At this point, brackets and multiple dots like this
> don't really make things clearer to me (Not to mention John's post below,
> with 3 consecutive dots ! I'm really having trouble with that one !). Of
> course, a lot of this is due to my lack of understanding - I'll keep
> experimenting and trying to learn :)
>
> In general though, do people find this style clearer ?
> I'd be interested to know what other people prefer.
>
> Thanks for all the help :)
If you compose single-argument functions, the pointfree
composition = f . g . h
seems clearer than
composition x = f . g . h $ x
, a case like howMany,
howMany = (length .) . matches
is sufficiently clear either way (less if written ((.) . (.)) length matches),
but beyond that supplying arguments is desirable.
Would you prefer to read
composition = ((.) . (.) . (.) . (.) . (.)) func thing
composition = ((((func .) .) .) .) . thing
composition a b c d = func . thing a b c d
or
composition a b c d e = func $ thing a b c d e
?
IMO, the last two are okay, the first is baaad, the second bad unless in
special circumstances.
More information about the Beginners
mailing list