[Haskell-beginners] No accumulation of partially applied functions allowed?

Brent Yorgey byorgey at seas.upenn.edu
Wed Jun 27 20:26:49 CEST 2012

On Tue, Jun 26, 2012 at 06:39:11PM -0400, Jay Sulzberger wrote:
> On Tue, 26 Jun 2012, Alec Story <avs38 at cornell.edu> wrote:
> >Because of Haskell's type system, there are some expressions that you
> >simply cannot compile.  Most of them you don't *want* to compile because
> >they do bad things (like add two strings, for example).  Some things are
> >legal in Lisp but don't typecheck in Haskell for exactly the reasons that
> >Brent pointed out.  They might make sense in some contexts, but the
> >compiler isn't able to reason about them.
> Thanks, Alec.
> What is a formalized version of
>   It is not possible in Haskell to define `applyTo`.*
>   * At least not without crazy type class hackery.
> I think the difficulty must arise mainly from the *, meaning I
> think, "any type" in the above `applyTo`.*.  Would it be
> easy/convenient to define `applyTo`.(a, b, c) where a is a "type
> variable"?  In general can we, for any finite number n, where n > 2,
> easily/conveniently define `applyTo`.(a1, a2, ..., an) ?

Haha, sorry, it seems my meta-notation was confusing. `applyTo`.* is
`applyTo`, followed by a period (indicating the end of the sentence),
followed by an asterisk (indicating the presence of a footnote).  It
is not a technical notation at all. =)

In any case, yes, you can define `applyTo` for any specific number
of parameters.  For example,

  applyTo3 :: (a -> a -> a -> b) -> [a] -> b
  applyTo3 f [x,y,z] = f x y z

(although I do not recommend even this, because applyTo3 will crash if
you pass it a list of the wrong length). But you cannot define a
single `applyTo` which works for any number of parameters.  The
problem is that every expression in Haskell must have a type, and
Haskell's type system is not expressive enough to write down a valid
type for applyTo. (What would the type of its first argument be?)


More information about the Beginners mailing list