<div dir="ltr"><div><div><div>The phantom type doesn't appear on the actual constructors, only on the  type signatures.  In the function convertToReq, you are changing the following<br></div>1. The type.<br></div>2. The value of the price record (actually returning a new value with the price record changed to one and the rest of the fields being the same.<br><br><br><br></div><div>That said, I don't see the point of a phantom on a record structure like this.  Phantoms are more useful when you have multiple data constructors for a given type and you want to make sure you don't have constructions that don't make sense.  Like in an interpreter, you don't want to create expressions that can give rise to an expressions like add a integer to a string and that sort of thing.<br><br></div><div>Try this:  <a href="http://www.scs.stanford.edu/11au-cs240h/notes/laziness-slides.html">http://www.scs.stanford.edu/11au-cs240h/notes/laziness-slides.html</a><br></div><div><br></div><div>In fact, that set of lecture notes as well as the 2014 class notes are amazingly good.<br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jun 17, 2015 at 6:13 AM, Dimitri DeFigueiredo <span dir="ltr"><<a href="mailto:defigueiredo@ucdavis.edu" target="_blank">defigueiredo@ucdavis.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi All,<br>
<br>
I am a little suprised that this program compiles in GHC:<br>
<br>
----<br>
data ReqTime = ReqTime<br>
data AckTime = AckTime<br>
<br>
data Order a = Order { price  ::Double, volume ::Int, timestamp ::Int }<br>
<br>
convertToReq :: Order AckTime -> Order ReqTime<br>
convertToReq o = o{price = 1}<br>
<br>
main = putStrLn "Hi!"<br>
----<br>
<br>
My trouble is that it seems the record syntax is *implicitly* converting from one type to the other. It seems I would have to remove the phantom type to avoid this:<br>
<br>
----<br>
data Order a = Order { price  ::Double, volume ::Int, timestamp ::Int, myType :: a }<br>
<br>
convertToReq :: Order AckTime -> Order ReqTime<br>
convertToReq o = o{price = 1}  -- fail!!<br>
----<br>
<br>
Could somebody sprinkle some insight into why this is "converted automatically" for phantom types? Can I avoid this behavior?<br>
<br>
Thanks!<br>
<br>
Dimitri<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><br></div>