<div dir="ltr">Now I fixed it in a slightly different way:<div><br></div><div><br></div><div><div><font face="courier new, monospace">{-# LANGUAGE FlexibleContexts, FlexibleInstances, TypeFamilies, OverloadedStrings #-}</font></div>
<div><font face="courier new, monospace">module Main where</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">import Control.Applicative</font></div><div><font face="courier new, monospace">import Control.Applicative.Indexed</font></div>
<div><font face="courier new, monospace">import Control.Monad</font></div><div><font face="courier new, monospace">import qualified Data.ByteString.Char8 as C</font></div><div><font face="courier new, monospace">import Text.Blaze </font></div>
<div><font face="courier new, monospace">import Text.Blaze.Html </font></div><div><font face="courier new, monospace">import qualified Text.Blaze.Html5 as H</font></div><div><font face="courier new, monospace">import qualified Text.Blaze.Html5.Attributes as A</font></div>
<div><font face="courier new, monospace">import Text.Blaze.Renderer.Utf8 (renderHtml)</font></div><div><font face="courier new, monospace">import Text.Reform</font></div><div><font face="courier new, monospace">import Text.Reform.Blaze.Common</font></div>
<div><span style="font-family:&#39;courier new&#39;,monospace">import Text.Reform.Happstack</span><br></div><div><font face="courier new, monospace">import Happstack.Server</font></div><div><font face="courier new, monospace">import SharedForm</font></div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">instance ToMarkup (DemoFormError [Input]) where</font></div><div><font face="courier new, monospace">    toMarkup InvalidEmail    = &quot;Email address must contain a @.&quot;</font></div>
<div><font face="courier new, monospace">    toMarkup InvalidUsername = &quot;Username must not be blank.&quot;</font></div><div><font face="courier new, monospace">    toMarkup (CommonError (InputMissing fid))        = H.toHtml $ &quot;Internal Error. Input missing: &quot; ++ show fid</font></div>
<div><font face="courier new, monospace">    toMarkup (CommonError (NoStringFound input))     = H.toHtml $ &quot;Internal Error. Could not extract a String from: &quot; ++ show input</font></div><div><font face="courier new, monospace">    toMarkup (CommonError (MultiStringsFound input)) = H.toHtml $ &quot;Internal Error. Found more than one String in: &quot; ++ show input</font></div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">usernameForm :: (Monad m, FormInput input, ToMarkup (DemoFormError input)) =&gt;</font></div><div><font face="courier new, monospace">                     String</font></div>
<div><font face="courier new, monospace">                  -&gt; Form m input (DemoFormError input) Html () Username</font></div><div><font face="courier new, monospace">usernameForm initialValue =</font></div><div><font face="courier new, monospace">    Username &lt;$&gt; <b>inputText initialValue</b>  </font></div>
<div><font face="courier new, monospace"> </font></div><div><font face="courier new, monospace">emailForm :: (Monad m, FormInput input, ToMarkup (DemoFormError input)) =&gt;</font></div><div><font face="courier new, monospace">                  String</font></div>
<div><font face="courier new, monospace">               -&gt; Form m input (DemoFormError input) Html ValidEmail Email</font></div><div><font face="courier new, monospace">emailForm initialValue    =</font></div><div><font face="courier new, monospace">    errorList ++&gt; (label &quot;email: &quot; ++&gt; (Email    &lt;&lt;$&gt;&gt; <b>inputText initialValue</b> `prove` (validEmailProof InvalidEmail)))</font></div>
</div><div><font face="courier new, monospace"><br></font></div><div><br></div><div> and got something even stranger:</div><div><br></div><div><br></div><div><div><font face="courier new, monospace">Taser.hs:32:18:</font></div>
<div><font face="courier new, monospace">    Couldn&#39;t match expected type `Form</font></div><div><font face="courier new, monospace">                                    m input (DemoFormError input) Html () String&#39;</font></div>
<div><font face="courier new, monospace">                with actual type `text0 -&gt; Form m0 input0 error0 Html () text0&#39;</font></div><div><font face="courier new, monospace">    In the return type of a call of `inputText&#39;</font></div>
<div><font face="courier new, monospace">    Probable cause: `inputText&#39; is applied to too few arguments</font></div><div><font face="courier new, monospace">    In the second argument of `(&lt;$&gt;)&#39;, namely `inputText initialValue&#39;</font></div>
<div><font face="courier new, monospace">    In the expression: Username &lt;$&gt; inputText initialValue</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">Taser.hs:38:56:</font></div>
<div><font face="courier new, monospace">    Couldn&#39;t match expected type `Form</font></div><div><font face="courier new, monospace">                                    m input (DemoFormError input) Html q0 a0&#39;</font></div>
<div><font face="courier new, monospace">                with actual type `text0 -&gt; Form m0 input0 error0 Html () text0&#39;</font></div><div><font face="courier new, monospace">    In the return type of a call of `inputText&#39;</font></div>
<div><font face="courier new, monospace">    Probable cause: `inputText&#39; is applied to too few arguments</font></div><div><font face="courier new, monospace">    In the first argument of `prove&#39;, namely `inputText initialValue&#39;</font></div>
<div><font face="courier new, monospace">    In the second argument of `(&lt;&lt;$&gt;&gt;)&#39;, namely</font></div><div><font face="courier new, monospace">      `inputText initialValue `prove` (validEmailProof InvalidEmail)&#39;</font></div>
</div><div><br></div><div><br></div><div style>Please would somebody explain what&#39;s going on?</div><div style>Adrian.</div><div style><br></div><div style><br></div><div><br></div></div><div class="gmail_extra"><br><br>
<div class="gmail_quote">On 15 June 2013 17:19, Adrian May <span dir="ltr">&lt;<a href="mailto:adrian.alexander.may@gmail.com" target="_blank">adrian.alexander.may@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr"><div>Hi All,</div><div><br></div><div>I&#39;m trying to get this example working:</div><div><br></div><div><font face="courier new, monospace"><a href="http://patch-tag.com/r/stepcut/reform/snapshot/current/content/pretty/examples/BlazeMain.hs" target="_blank">http://patch-tag.com/r/stepcut/reform/snapshot/current/content/pretty/examples/BlazeMain.hs</a></font></div>

<div><br></div><div>It emitted what I took to be bitrot about ToHtml having apparently been generallised to ToMarkup and similar stuff, so I banged it into this form:</div><div><br></div><div><font face="courier new, monospace">    {-# LANGUAGE FlexibleContexts, FlexibleInstances, TypeFamilies, OverloadedStrings #-}</font></div>

<div><font face="courier new, monospace">    module Main where</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    import Control.Applicative.Indexed</font></div>

<div><font face="courier new, monospace">    import Control.Monad</font></div><div><font face="courier new, monospace">    import qualified Data.ByteString.Char8 as C</font></div><div><font face="courier new, monospace"><i>    import Text.Blaze </i></font></div>

<div><font face="courier new, monospace">    import qualified Text.Blaze.Html5 as H</font></div><div><font face="courier new, monospace">    import qualified Text.Blaze.Html5.Attributes as A</font></div><div><font face="courier new, monospace">    import Text.Blaze.Renderer.Utf8 (renderHtml)</font></div>

<div><font face="courier new, monospace">    import Text.Reform</font></div><div><font face="courier new, monospace"><i>    --import Text.Reform.Blaze.Common</i></font></div><div><font face="courier new, monospace"><i>    --import Text.Reform.Blaze.Text</i></font></div>

<div><font face="courier new, monospace"><i>    import Text.Reform.Blaze.String</i></font></div><div><font face="courier new, monospace">    import Text.Reform.Happstack</font></div><div><font face="courier new, monospace">    import Happstack.Server</font></div>

<div><font face="courier new, monospace">    import SharedForm</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    instance <i>ToMarkup</i> (DemoFormError [Input]) where</font></div>

<div><font face="courier new, monospace"><span style="white-space:pre-wrap">        </span><i>toMarkup</i> InvalidEmail    = &quot;Email address must contain a @.&quot;</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">        </span><i>toMarkup</i> InvalidUsername = &quot;Username must not be blank.&quot;</font></div>

<div><font face="courier new, monospace"><span style="white-space:pre-wrap">        </span><i>toMarkup</i> (CommonError (InputMissing fid))        = H.toHtml $ &quot;Internal Error. Input missing: &quot; ++ show fid</font></div>

<div><font face="courier new, monospace"><span style="white-space:pre-wrap">        </span><i>toMarkup</i> (CommonError (NoStringFound input))     = H.toHtml $ &quot;Internal Error. Could not extract a String from: &quot; ++ show input</font></div>

<div><font face="courier new, monospace"><span style="white-space:pre-wrap">        </span><i>toMarkup</i> (CommonError (MultiStringsFound input)) = H.toHtml $ &quot;Internal Error. Found more than one String in: &quot; ++ show input</font></div>

<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    usernameForm :: (Monad m, FormInput input, <i>ToMarkup</i> (DemoFormError input)) =&gt;</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">                        </span>String</font></div>

<div><font face="courier new, monospace"><span style="white-space:pre-wrap">                </span>      -&gt; Form m input (DemoFormError input) <i>Markup</i> NotNull Username</font></div><div><font face="courier new, monospace">    usernameForm initialValue =</font></div>

<div><font face="courier new, monospace"><span style="white-space:pre-wrap">        </span>( <b>label &quot;username: &quot; ++&gt;</b> (Username &lt;&lt;$&gt;&gt; inputText initialValue `prove` (notNullProof InvalidUsername)))</font></div>

<div><font face="courier new, monospace">    {-</font></div><div><font face="courier new, monospace">    usernameForm :: (Monad m, FormInput input, ToMarkup (DemoFormError input)) =&gt;</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">                        </span>String</font></div>

<div><font face="courier new, monospace"><span style="white-space:pre-wrap">                </span>      -&gt; Form m input (DemoFormError input) Markup NotNull Username</font></div><div><font face="courier new, monospace">    usernameForm initialValue =</font></div>

<div><font face="courier new, monospace"><span style="white-space:pre-wrap">        </span>errorList ++&gt; (<b>label &quot;username: &quot; ++&gt; </b>(Username &lt;&lt;$&gt;&gt; inputText initialValue `prove` (notNullProof InvalidUsername)))</font></div>

<div><font face="courier new, monospace">    -}</font></div><div><font face="courier new, monospace">    blazeResponse :: <i>Markup</i> -&gt; Response</font></div><div><font face="courier new, monospace">    blazeResponse html = toResponseBS (C.pack &quot;text/html;charset=UTF-8&quot;) $ renderHtml html</font></div>

<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    blazeForm :: <i>Markup</i> -&gt; <i>Markup</i></font></div><div><font face="courier new, monospace">    blazeForm html =</font></div>

<div><font face="courier new, monospace"><span style="white-space:pre-wrap">        </span>H.form ! A.action &quot;/&quot;</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">        </span>      ! A.method &quot;POST&quot;</font></div>

<div><font face="courier new, monospace"><span style="white-space:pre-wrap">        </span>      ! A.enctype &quot;multipart/form-data&quot; $</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">                </span>do html</font></div>

<div><font face="courier new, monospace"><span style="white-space:pre-wrap">                </span>    H.input ! A.type_ &quot;submit&quot;</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    formHandler :: (<i>ToMarkup</i> error, Show a) =&gt; Form (ServerPartT IO) [Input] error <i>Markup</i> proof a -&gt; ServerPart Response</font></div>

<div><font face="courier new, monospace">    formHandler form =</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">        </span>    msum [ do method GET</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">                </span>      html &lt;- viewForm &quot;user&quot; form</font></div>

<div><font face="courier new, monospace"><span style="white-space:pre-wrap">                </span>      ok $ blazeResponse $ blazeForm html</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">                </span>, do method POST</font></div>

<div><font face="courier new, monospace"><span style="white-space:pre-wrap">                </span>      r &lt;- eitherForm environment &quot;user&quot; form</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">                </span>      case r of</font></div>

<div><font face="courier new, monospace"><span style="white-space:pre-wrap">                        </span>(Right a) -&gt; ok $ toResponse $ show a</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">                        </span>(Left view) -&gt;</font></div>

<div><font face="courier new, monospace"><span style="white-space:pre-wrap">                                </span>  ok $ blazeResponse $ blazeForm view</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">                </span>]</font></div>

<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    main :: IO ()</font></div><div><font face="courier new, monospace">    main =</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">        </span>do let form = usernameForm &quot;&quot; </font></div>

<div><font face="courier new, monospace"><span style="white-space:pre-wrap">        </span>  simpleHTTP nullConf $ do decodeBody (defaultBodyPolicy &quot;/tmp&quot; 0 10000 10000)</font></div><div><font face="courier new, monospace"><span style="white-space:pre-wrap">                                </span>    formHandler form</font></div>

<div><br></div><div><br></div><div>where <i>italics</i> indicate the bits I changed, but now I&#39;m stumped by the <b>bold</b> bit barfing with: </div><div><br></div><div><font face="courier new, monospace">Taser.hs:30:13:</font></div>

<div><font face="courier new, monospace">    Ambiguous type variable `children0&#39; in the constraints:</font></div><div><font face="courier new, monospace">      (Data.String.IsString children0)</font></div><div><font face="courier new, monospace">        arising from the literal `&quot;username: &quot;&#39; at Taser.hs:30:13-24</font></div>

<div><font face="courier new, monospace">      (ToMarkup children0)</font></div><div><font face="courier new, monospace">        arising from a use of `label&#39; at Taser.hs:30:7-11</font></div><div><font face="courier new, monospace">    Probable fix: add a type signature that fixes these type variable(s)</font></div>

<div><font face="courier new, monospace">    In the first argument of `label&#39;, namely `&quot;username: &quot;&#39;</font></div><div><font face="courier new, monospace">    In the first argument of `(++&gt;)&#39;, namely `label &quot;username: &quot;&#39;</font></div>

<div><font face="courier new, monospace">    In the expression:</font></div><div><font face="courier new, monospace">      (label &quot;username: &quot;</font></div><div><font face="courier new, monospace">       ++&gt;</font></div>

<div><font face="courier new, monospace">         (Username</font></div><div><font face="courier new, monospace">          &lt;&lt;$&gt;&gt;</font></div><div><font face="courier new, monospace">            inputText initialValue `prove` (notNullProof InvalidUsername)))</font></div>

<div><br></div><div>If I take out <font face="courier new, monospace">label &quot;username: &quot; ++&gt;</font>, then it all works fine, except I don&#39;t have a label. I also tried putting the label inside the Username constructor with the same result.</div>

<div><br></div><div>I have the following versions installed:</div><div><br></div><div><font face="courier new, monospace">* blaze-markup     (library)</font></div><div><font face="courier new, monospace">    Versions installed: 0.5.1.5</font></div>

<div><font face="courier new, monospace">* blaze-html       (library)</font></div><div><font face="courier new, monospace">    Versions installed: 0.6.1.1</font></div><div><font face="courier new, monospace">* reform           (library)</font></div>

<div><font face="courier new, monospace">    Versions installed: 0.1.2</font></div><div><font face="courier new, monospace">* reform-blaze     (library)</font></div><div><font face="courier new, monospace">    Versions installed: 0.1.2</font></div>

<div><font face="courier new, monospace">The Glorious Glasgow Haskell Compilation System, version 7.4.2</font></div><div><br></div><div>Perhaps the markup thing is what broke it, but I can&#39;t see ToHtml in any of those modules.</div>

<div><br></div><div>Thanks in advance,</div><div>Adrian.</div><div><br></div><div><br></div><div><br></div></div>
</blockquote></div><br></div>