<p dir="ltr">Take a look at Text.Printf which takes this idea even further with its printf function, which can accept an arbitrary number of arguments. This is achieved by basically using your approach but with a recursive instance.</p>

<div class="gmail_quote">On Jul 26, 2013 10:10 PM, &quot;Micah Cowan&quot; &lt;<a href="mailto:micah@cowan.name">micah@cowan.name</a>&gt; wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
So, just for fun, I came up with a way to abuse the language in order to<br>
define a &quot;function&quot; whose argument is optional:<br>
<br>
&gt; -- dirty-trick.hs - A sneaky way to do var args fns in Haskell<br>
&gt;<br>
&gt; {-# LANGUAGE FlexibleInstances #-}<br>
&gt;<br>
&gt; class Hello a where<br>
&gt;     hello :: a<br>
&gt;<br>
&gt; instance Hello (String -&gt; String) where<br>
&gt;     hello = (\str -&gt; &quot;Hello &quot; ++ str)<br>
&gt;<br>
&gt; instance Hello String where<br>
&gt;     hello = hello &quot;World&quot;<br>
<br>
In ghci,<br>
<br>
  putStrLn $ hello<br>
<br>
gives &quot;Hello World&quot;, while<br>
<br>
  putStrLn $ hello &quot;There&quot;<br>
<br>
gives &quot;Hello&quot;.<br>
<br>
.<br>
<br>
I was wondering if there was a way to do it in &quot;pure&quot; Haskell (i.e., no<br>
GHC pragmas required), and also the specific reason for why the above<br>
example doesn&#39;t work without the pragma (I think it&#39;s just that in<br>
general a -&gt; b is not syntactically allowed for type specifiers within<br>
instance declarations)?<br>
<br>
I&#39;m also interested in alternative approaches to creating<br>
variable-argument functions, if there are any.<br>
<br>
.<br>
<br>
If anyone&#39;s curious, this was prompted by a discussion with a friend<br>
(copied), about Haskell and Clojure. He mentioned that Clojure can<br>
accept variable arguments, though AFAICT all Clojure functions basically<br>
act like they take a list (that supports variable types), so accepting<br>
an empty argument list is a bit analogous to Haskell accepting an empty<br>
list, rather than no arguments.<br>
<br>
Part of the reason Haskell can&#39;t really take &quot;variable arguments&quot; is<br>
that all Haskell functions really just take one argument. But I figured<br>
you could use the contextually expected type to decide whether to return<br>
a simple value (not /technically/ a function in that case), or a function<br>
expecting further arguments, which could then be extended to define a<br>
function taking any arbitrary number of arguments.<br>
<br>
Cheers!<br>
-mjc<br>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</blockquote></div>