<div dir="ltr"><div>I'm not sure I understand your question Mike.<br>Are you saying <font face="monospace">createIntM</font> behaves as desired but the data constructor M could let you build a data <font face="monospace">M</font> with the wrong type. for instance <font face="monospace">M [1,2] :: M 1 </font><font face="monospace">Int</font> ?</div><div><div><br></div><div>If that is your question, then one way to handle this is to have a separate module where you define the data type and the proper constructor (here M and <span style="font-family:monospace">createIntM) </span>but where you do not expose the type constructor. so something like<br></div><div><br></div><div><div><font face="monospace">module MyModule</font></div><div><font face="monospace">  ( M -- as opposed to M(..) to not expose the type constructor</font></div><div><font face="monospace">  , createIntM</font></div><div><font face="monospace">  ) where</font></div></div><div><br></div><div>Then, outside of MyModule, you can not create an incorrect lentgh annotated list since the only way to build it is through <span style="font-family:monospace">createIntM</span></div><div><span style="font-family:monospace"><br></span></div><div>Does that make sense?</div><div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Mar 14, 2019 at 4:19 PM mike h <<a href="mailto:mike_k_houghton@yahoo.co.uk">mike_k_houghton@yahoo.co.uk</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word;line-break:after-white-space"><span style="font-size:20px">Hi,</span><div><span style="font-size:20px">Thanks for the pointers. So I’ve got</span></div><div><span style="font-size:20px"><br></span></div><div><span style="font-size:20px">data M (n :: Nat) a = M [a] deriving Show<br><br>t2 :: M 2 Int<br>t2  = M [1,2]<br><br>t3 :: M 3 Int<br>t3 = M [1,2,3]<br><br>fx :: Num a => M n a -> M n a -> M n a<br>fx (M xs) (M ys) = M (zipWith (+) xs ys)<br></span></div><div><span style="font-size:20px"><br></span></div><div><span style="font-size:20px">and having </span></div><div><span><span style="font-size:20px">g = fx t2 t3</span><br></span></div><div><br></div><div><span style="font-size:20px">won’t compile. Which is what I want.</span></div><div><span style="font-size:20px">However…</span></div><div><span style="font-size:20px"><br></span></div><div><span style="font-size:20px">t2</span><span style="font-size:20px"> </span><span style="font-size:20px">::</span><span style="font-size:20px"> </span><span style="font-size:20px">M</span><span style="font-size:20px"> 2 </span><span style="font-size:20px">Int</span><br style="font-size:20px"><span style="font-size:20px">t2  </span><span style="font-size:20px">=</span><span style="font-size:20px"> </span><span style="font-size:20px">M</span><span style="font-size:20px"> [</span><span style="font-size:20px">1</span><span style="font-size:20px">,</span><span style="font-size:20px">2</span><span style="font-size:20px">]</span></div><div><span style="font-size:20px"><br></span></div><div><span style="font-size:20px">is ‘hardwired’ to 2 and clearly I could make t2 return  a list of any length. </span></div><div><span style="font-size:20px">So what I then tried to look at was a general function that would take a list of Int and create the M type using the length of the supplied list. </span></div><div><span style="font-size:20px">In other words if I supply a list, xs, of length n then I wan’t  M n xs</span></div><div><span style="font-size:20px">Like this</span></div><div><span style="font-size:20px"><br></span></div><div><span style="font-size:20px"><span>createIntM xs </span><span>=</span><span> (</span><span>M</span><span> xs) </span><span>::</span><span> </span><span>M</span><span> (</span><span>length</span><span> </span><span>xs</span><span>) </span><span>Int</span></span></div><div><span style="font-size:20px"><span><br></span></span></div><div><span style="font-size:20px">which compile and has type</span></div><div><div><span style="font-size:20px">λ-> :t createIntM </span></div><div><span style="font-size:20px">createIntM :: [Int] -> M (length xs) Int</span></div></div><div><span style="font-size:20px"><br></span></div><div><span style="font-size:20px">and all Ms created using </span><span style="font-size:20px">createIntM  have the same type irrespective of the length of the supplied list.</span></div><div><span style="font-size:20px"><br></span></div><div><span style="font-size:20px">What’s the type jiggery I need or is this not the right way to go?</span></div><div><span style="font-size:20px"><br></span></div><div><span style="font-size:20px">Thanks</span></div></div><div style="word-wrap:break-word;line-break:after-white-space"><div><span style="font-size:20px"><br></span></div><div><span style="font-size:20px">Mike</span></div></div><div style="word-wrap:break-word;line-break:after-white-space"><div><span style="font-size:20px"><br></span></div><div><span style="font-size:20px"><br></span></div><div><span style="font-size:20px"><br></span></div><div><div><br><blockquote type="cite"><div>On 14 Mar 2019, at 13:12, Frederic Cogny <<a href="mailto:frederic.cogny@gmail.com" target="_blank">frederic.cogny@gmail.com</a>> wrote:</div><br class="m_8211798119830778800Apple-interchange-newline"><div>The (experimental) Static module of hmatrix seems (I've used the packaged but not that module) to do exactly that: <a href="http://hackage.haskell.org/package/hmatrix-0.19.0.0/docs/Numeric-LinearAlgebra-Static.html" target="_blank">http://hackage.haskell.org/package/hmatrix-0.19.0.0/docs/Numeric-LinearAlgebra-Static.html</a><div><br><br><br><div class="gmail_quote"><div dir="ltr">On Thu, Mar 14, 2019, 12:37 PM Francesco Ariis <<a href="mailto:fa-ml@ariis.it" target="_blank">fa-ml@ariis.it</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello Mike,<br>
<br>
On Thu, Mar 14, 2019 at 11:10:06AM +0000, mike h wrote:<br>
> Multiplication of two matrices is only defined when the the number of columns in the first matrix <br>
> equals the number of rows in the second matrix. i.e. c1 == r2<br>
> <br>
> So when writing the multiplication function I can check that  c1 == r2 and do something.<br>
> However what I really want to do, if possible, is to have the compiler catch the error. <br>
<br>
Type-level literals [1] or any kind of similar trickery should help you<br>
with having matrices checked at compile-time.<br>
<br>
[1] <a href="https://downloads.haskell.org/~ghc/7.10.1/docs/html/users_guide/type-level-literals.html" rel="noreferrer" target="_blank">https://downloads.haskell.org/~ghc/7.10.1/docs/html/users_guide/type-level-literals.html</a><br>
_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
</blockquote></div></div>-- <br><div dir="ltr" class="m_8211798119830778800gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><font>Frederic Cogny<br></font></div><font><font>+33 </font><span>7 83 12 61 69</span></font><br></div></div>
_______________________________________________<br>Beginners mailing list<br><a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br><a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br></div></blockquote></div><br></div></div></blockquote></div></div></div></div>-- <br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><font color="#000000">Frederic Cogny<br></font></div><font color="#000000"><font>+33 </font><span>7 83 12 61 69</span></font><br></div></div>