Thanks a lot for the correction, I guess the right identity law would be violated, right? I was think about the type constructor stuff, next time should definitely think about the laws first.<span></span><br><br>On Tuesday, June 17, 2014, Bob Ippolito <<a href="mailto:bob@redivi.com">bob@redivi.com</a>> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Your understanding is not correct. The monad laws would be violated If return did make a new mutable object. <a href="http://www.haskell.org/haskellwiki/Monad_laws" target="_blank">http://www.haskell.org/haskellwiki/Monad_laws</a><div>

<br></div><div>Side-effects typically have a `m ()` return type, so your "more Haskell" way is not idiomatic Haskell.<br><div class="gmail_extra"><br></div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">

On Tue, Jun 17, 2014 at 7:53 PM, Baojun Wang <span dir="ltr"><<a href="javascript:_e(%7B%7D,'cvml','wangbj@gmail.com');" target="_blank">wangbj@gmail.com</a>></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 class="gmail_default" style="font-family:'times new roman',serif">To make my question more clearer, will test1/test2 have noticeable performance difference?</div><div class="gmail_default" style="font-family:'times new roman',serif">


<br></div><div class="gmail_default" style="font-family:'times new roman',serif">-- mutable1.hs</div><div class="gmail_default" style="font-family:'times new roman',serif"><span><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt">


<span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">import qualified Data.Vector.Mutable as MV</span></p><br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt">


<span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">import Control.Monad</span></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt">


<span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">import Control.Monad.Primitive</span></p><br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt">


<span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">a1 :: (PrimMonad m) => MV.MVector (PrimState m) a -> m ()</span></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt">


<span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">a1 v = do</span></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt">


<span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">  -- do something</span></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt">


<span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">  return ()</span></p><br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt">


<span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">a2 :: (PrimMonad m) => MV.MVector (PrimState m) a -> m ()</span></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt">


<span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">a2 v = do</span></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt">


<span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">  -- do something else</span></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt">


<span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">  return ()</span></p><br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt">


<span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">b1 :: (PrimMonad m) => MV.MVector (PrimState m) a -> m (MV.MVector (PrimState m) a)</span></p>


<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">b2 :: (PrimMonad m) => MV.MVector (PrimState m) a -> m (MV.MVector (PrimState m) a)</span></p>


<br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">b1 v = do</span></p>


<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">  -- do something different</span></p>


<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">  return v</span></p>


<br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">b2 v = do</span></p>


<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">  -- do something else different</span></p>


<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">  return v</span></p>


<br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">test1 :: IO ()</span></p>


<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">test1 = do</span></p>


<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">  v1 <- MV.replicate 1000 0</span></p>


<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">  a1 v1</span></p>


<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">  a2 v1</span></p>


<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">  return ()</span></p>


<br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">test2 :: IO ()</span></p>


<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">test2 = </span></p>


<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">  MV.replicate 1000 0 >>= b1 >>= b2 >> return ()    -- I'd prefer this way cause it's more haskell.</span></p>


<br><br></span></div></div><div><div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Jun 17, 2014 at 5:50 PM, Baojun Wang <span dir="ltr"><<a href="javascript:_e(%7B%7D,'cvml','wangbj@gmail.com');" target="_blank">wangbj@gmail.com</a>></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 class="gmail_default" style="font-family:times new roman,serif">Hi List,</div><div class="gmail_default" style="font-family:times new roman,serif">


<br></div><div class="gmail_default" style="font-family:times new roman,serif">
Per my understanding, return x would make a new copy of the object. What if the returned object is mutable? Will this make a new (mutable) object? </div><div class="gmail_default" style="font-family:times new roman,serif">



<br></div><div class="gmail_default" style="font-family:times new roman,serif">My concern is if I created a very large mutable object, does return mutable make a full copy of the original mutable data, or just copy a reference (pointer?)?</div>



<div class="gmail_default" style="font-family:times new roman,serif"><br></div><div class="gmail_default" style="font-family:times new roman,serif">Thanks</div><span><font color="#888888"><div class="gmail_default" style="font-family:times new roman,serif">



baojun</div></font></span></div>
</blockquote></div><br></div>
</div></div><br>_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="javascript:_e(%7B%7D,'cvml','Haskell-Cafe@haskell.org');" target="_blank">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>
<br></blockquote></div><br></div>
</blockquote>