<table cellspacing="0" cellpadding="0" border="0" ><tr><td valign="top" style="font: inherit;">I wasn't comparing functions, you were. I was just trying to answer your questions.<br><br>I had a count function that worked fine for an enum type, but thought why not go polymorphic with it. So I changed it and got the error I originally inquired about.<br><br>Thanks.<br><br>Michael<br><br>--- On <b>Sat, 4/18/09, Eugene Kirpichov <i>&lt;ekirpichov@gmail.com&gt;</i></b> wrote:<br><blockquote style="border-left: 2px solid rgb(16, 16, 255); margin-left: 5px; padding-left: 5px;"><br>From: Eugene Kirpichov &lt;ekirpichov@gmail.com&gt;<br>Subject: Re: [Haskell-cafe] General function to count list elements?<br>To: "michael rice" &lt;nowgate@yahoo.com&gt;<br>Cc: haskell-cafe@haskell.org<br>Date: Saturday, April 18, 2009, 1:18 PM<br><br><div class="plainMail">2009/4/18 michael rice &lt;<a ymailto="mailto:nowgate@yahoo.com"
 href="/mc/compose?to=nowgate@yahoo.com">nowgate@yahoo.com</a>&gt;:<br>&gt;&gt; To compare two functions in C, I would compare their machine addresses.<br>&gt;&gt;<br>&gt;<br>&gt; Why would you need that at all?<br>&gt;<br>&gt; How would *you* do it?<br><br>Do what?<br><br>As for comparing functions, I would not do it at all, because<br>comparing functions makes no sense: one way of comparison (extensional<br>equality) is not implementable, whereas the other (object identity)<br>breaks referential transparency and is impossible to reason about and<br>generally doesn't have a single reason to work correctly at all.<br>Object identity has no reason to exist in a language without mutable<br>objects, like Haskell. That's probably the key.<br><br><br>As for implementing the count function, I would implement it in the<br>way that people already suggested to you: by putting a constraint onto<br>its type, namely a constraint that makes it polymorphic *over
 types<br>whose values can be compared for equality*, t.i. over members of the<br>Eq class. This is perfectly correct and does not cause any<br>mathematical unsoundness.<br><br><br><br><br>&gt;<br>&gt; Michael<br>&gt;<br>&gt; ================<br>&gt;<br>&gt; --- On Sat, 4/18/09, Eugene Kirpichov &lt;<a ymailto="mailto:ekirpichov@gmail.com" href="/mc/compose?to=ekirpichov@gmail.com">ekirpichov@gmail.com</a>&gt; wrote:<br>&gt;<br>&gt; From: Eugene Kirpichov &lt;<a ymailto="mailto:ekirpichov@gmail.com" href="/mc/compose?to=ekirpichov@gmail.com">ekirpichov@gmail.com</a>&gt;<br>&gt; Subject: Re: [Haskell-cafe] General function to count list elements?<br>&gt; To: "michael rice" &lt;<a ymailto="mailto:nowgate@yahoo.com" href="/mc/compose?to=nowgate@yahoo.com">nowgate@yahoo.com</a>&gt;<br>&gt; Cc: <a ymailto="mailto:haskell-cafe@haskell.org" href="/mc/compose?to=haskell-cafe@haskell.org">haskell-cafe@haskell.org</a><br>&gt; Date: Saturday, April 18, 2009, 12:39
 PM<br>&gt;<br>&gt; 2009/4/18 michael rice &lt;<a ymailto="mailto:nowgate@yahoo.com" href="/mc/compose?to=nowgate@yahoo.com">nowgate@yahoo.com</a>&gt;:<br>&gt;&gt; I know functions can be compared in Scheme<br>&gt;&gt;<br>&gt;&gt; Welcome to DrScheme, version 4.1 [3m].<br>&gt;&gt; Language: Swindle; memory limit: 128 megabytes.<br>&gt;&gt;&gt; (equal? equal? equal?)<br>&gt;&gt; #t<br>&gt;&gt;&gt;<br>&gt;&gt;<br>&gt;<br>&gt; That's not the functions being compared, but the memory addresses of<br>&gt; the code implementing them. If your goal is comparing functions to<br>&gt; answer a question "Are these two values indistinguishable?", equal?<br>&gt; doesn't help you, because it may answer 'false' even if these two<br>&gt; values are indistinguishable from a mathematical point of view.<br>&gt;<br>&gt;&gt;<br>&gt;&gt; but apparently not in Haskell<br>&gt;&gt;<br>&gt;&gt; [michael@localhost ~]$ ghci<br>&gt;&gt; GHCi, version 6.10.1: <a
 href="http://www.haskell.org/ghc/%C2%A0" target="_blank">http://www.haskell.org/ghc/&nbsp;</a> :? for help<br>&gt;&gt; Loading package ghc-prim ... linking ... done.<br>&gt;&gt; Loading package integer ... linking ... done.<br>&gt;&gt; Loading package base ... linking ... done.<br>&gt;&gt; Prelude&gt; (==) (==) (==)<br>&gt;&gt;<br>&gt;&gt; &lt;interactive&gt;:1:0:<br>&gt;&gt; &nbsp;&nbsp;&nbsp; No instance for (Eq (a -&gt; a -&gt; Bool))<br>&gt;&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arising from a use of `==' at &lt;interactive&gt;:1:0-13<br>&gt;&gt; &nbsp;&nbsp;&nbsp; Possible fix: add an instance declaration for (Eq (a -&gt; a -&gt; Bool))<br>&gt;&gt; &nbsp;&nbsp;&nbsp; In the expression: (==) (==) (==)<br>&gt;&gt; &nbsp;&nbsp;&nbsp; In the definition of `it': it = (==) (==) (==)<br>&gt;&gt; Prelude&gt;<br>&gt;&gt;<br>&gt;&gt; though I'm new at Haskell and may not be posing the question properly.<br>&gt;&gt;<br>&gt;&gt; I would think a language with
 1st-class support for functions would<br>&gt;&gt; certainly include comparing them.<br>&gt;&gt;<br>&gt;<br>&gt; Again, this is first-class support for memory addresses of code<br>&gt; representing functions.<br>&gt;<br>&gt;&gt; To compare two functions in C, I would compare their machine addresses.<br>&gt;&gt;<br>&gt;<br>&gt; Why would you need that at all?<br>&gt;<br>&gt;&gt; Michael<br>&gt;&gt;<br>&gt;&gt;<br>&gt;&gt; --- On Sat, 4/18/09, Eugene Kirpichov &lt;<a ymailto="mailto:ekirpichov@gmail.com" href="/mc/compose?to=ekirpichov@gmail.com">ekirpichov@gmail.com</a>&gt; wrote:<br>&gt;&gt;<br>&gt;&gt; From: Eugene Kirpichov &lt;<a ymailto="mailto:ekirpichov@gmail.com" href="/mc/compose?to=ekirpichov@gmail.com">ekirpichov@gmail.com</a>&gt;<br>&gt;&gt; Subject: Re: [Haskell-cafe] General function to count list elements?<br>&gt;&gt; To: "michael rice" &lt;<a ymailto="mailto:nowgate@yahoo.com"
 href="/mc/compose?to=nowgate@yahoo.com">nowgate@yahoo.com</a>&gt;<br>&gt;&gt; Cc: <a ymailto="mailto:haskell-cafe@haskell.org" href="/mc/compose?to=haskell-cafe@haskell.org">haskell-cafe@haskell.org</a><br>&gt;&gt; Date: Saturday, April 18, 2009, 11:39 AM<br>&gt;&gt;<br>&gt;&gt; Could you then provide an example of two functions that *are* equal,<br>&gt;&gt; or, even better, a definition of equality for arbitrary functions?<br>&gt;&gt; Since Haskell may be compiled into C, this must be a definition that<br>&gt;&gt; is implementable in C.<br>&gt;&gt;<br>&gt;&gt; 2009/4/18 michael rice &lt;<a ymailto="mailto:nowgate@yahoo.com" href="/mc/compose?to=nowgate@yahoo.com">nowgate@yahoo.com</a>&gt;:<br>&gt;&gt;&gt; Though I haven't tried it out, it's trying to use my function to count<br>&gt;&gt;&gt; functions.<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; The first argument is the identity function.<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; The second argument is a list of a different
 form of the identity<br>&gt;&gt;&gt; function.<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; Though the two identity functions, given the same input, would produce<br>&gt;&gt;&gt; the<br>&gt;&gt;&gt; same output, I doubt they would be equal.<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; So my guess at an answer would be zero.<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; Michael<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; --- On Sat, 4/18/09, Eugene Kirpichov &lt;<a ymailto="mailto:ekirpichov@gmail.com" href="/mc/compose?to=ekirpichov@gmail.com">ekirpichov@gmail.com</a>&gt; wrote:<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; From: Eugene Kirpichov &lt;<a ymailto="mailto:ekirpichov@gmail.com" href="/mc/compose?to=ekirpichov@gmail.com">ekirpichov@gmail.com</a>&gt;<br>&gt;&gt;&gt; Subject: Re: [Haskell-cafe] General function to count list elements?<br>&gt;&gt;&gt; To: "michael rice" &lt;<a ymailto="mailto:nowgate@yahoo.com" href="/mc/compose?to=nowgate@yahoo.com">nowgate@yahoo.com</a>&gt;<br>&gt;&gt;&gt; Cc: <a
 ymailto="mailto:haskell-cafe@haskell.org" href="/mc/compose?to=haskell-cafe@haskell.org">haskell-cafe@haskell.org</a><br>&gt;&gt;&gt; Date: Saturday, April 18, 2009, 11:03 AM<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; What should<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; count (\x -&gt; x) (replicate 10 (\y -&gt; if 1==1 then y else undefined))<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; return?<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; 2009/4/18 michael rice &lt;<a ymailto="mailto:nowgate@yahoo.com" href="/mc/compose?to=nowgate@yahoo.com">nowgate@yahoo.com</a>&gt;:<br>&gt;&gt;&gt;&gt; Is there a general function to count list elements. I'm trying this<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt; count :: a -&gt; [a] -&gt; Int<br>&gt;&gt;&gt;&gt; count x ys = length (filter (== x) ys)<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt; with this error upon loading<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt; =============<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt; [michael@localhost ~]$ ghci count<br>&gt;&gt;&gt;&gt;
 GHCi, version 6.10.1: <a href="http://www.haskell.org/ghc/%C2%A0" target="_blank">http://www.haskell.org/ghc/&nbsp;</a> :? for help<br>&gt;&gt;&gt;&gt; Loading package ghc-prim ... linking ... done.<br>&gt;&gt;&gt;&gt; Loading package integer ... linking ... done.<br>&gt;&gt;&gt;&gt; Loading package base ... linking ... done.<br>&gt;&gt;&gt;&gt; [1 of 1] Compiling Main&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( count.hs, interpreted )<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt; count.hs:2:29:<br>&gt;&gt;&gt;&gt; &nbsp;&nbsp;&nbsp; Could not deduce (Eq a) from the context ()<br>&gt;&gt;&gt;&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arising from a use of `==' at count.hs:2:29-32<br>&gt;&gt;&gt;&gt; &nbsp;&nbsp;&nbsp; Possible fix:<br>&gt;&gt;&gt;&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add (Eq a) to the context of the type signature for `count'<br>&gt;&gt;&gt;&gt; &nbsp;&nbsp;&nbsp; In the first argument of `filter', namely `(==
 x)'<br>&gt;&gt;&gt;&gt; &nbsp;&nbsp;&nbsp; In the first argument of `length', namely `(filter (== x) ys)'<br>&gt;&gt;&gt;&gt; &nbsp;&nbsp;&nbsp; In the expression: length (filter (== x) ys)<br>&gt;&gt;&gt;&gt; Failed, modules loaded: none.<br>&gt;&gt;&gt;&gt; Prelude&gt;<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt; =============<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt; Not sure what it's trying to tell me other than I need an (Eq a)<br>&gt;&gt;&gt;&gt; somewhere.<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt; Michael<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt; _______________________________________________<br>&gt;&gt;&gt;&gt; Haskell-Cafe mailing list<br>&gt;&gt;&gt;&gt; <a ymailto="mailto:Haskell-Cafe@haskell.org" href="/mc/compose?to=Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>&gt;&gt;&gt;&gt; <a href="http://www.haskell.org/mailman/listinfo/haskell-cafe"
 target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;<br>&gt;&gt;&gt;<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; --<br>&gt;&gt;&gt; Eugene Kirpichov<br>&gt;&gt;&gt; Web IR developer, market.yandex.ru<br>&gt;&gt;&gt;<br>&gt;&gt;&gt;<br>&gt;&gt;<br>&gt;&gt;<br>&gt;&gt;<br>&gt;&gt; --<br>&gt;&gt; Eugene Kirpichov<br>&gt;&gt; Web IR developer, market.yandex.ru<br>&gt;&gt;<br>&gt;&gt;<br>&gt;<br>&gt;<br>&gt;<br>&gt; --<br>&gt; Eugene Kirpichov<br>&gt; Web IR developer, market.yandex.ru<br>&gt;<br>&gt;<br><br><br><br>-- <br>Eugene Kirpichov<br>Web IR developer, market.yandex.ru<br></div></blockquote></td></tr></table><br>