<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office"> <head> <meta name="viewport" content="width=device-width,initial-scale=1"> <!--[if gte mso 9]>
    <xml>
      <o:OfficeDocumentSettings>
        <o:AllowPNG/>
        <o:PixelsPerInch>96</o:PixelsPerInch>
     </o:OfficeDocumentSettings>
    </xml>
    <![endif]--> <style type="text/css">* a:hover{cursor:pointer;}</style> <style>body {-webkit-animation:bugfix infinite 1s;}@-webkit-keyframes bugfix {from {position:relative;}to {position:relative;}}</style> </head> <body style="word-wrap:normal;word-break:break-word"> <style>a {word-wrap:normal;word-break:break-word;}.background-contain {background-size:contain;}@media only screen and (max-width:600px) {.container {-webkit-text-size-adjust:none !important;}.container,.palm-one-whole {width:100% !important;min-width:100% !important;}.palm-one-half {width:50% !important;min-width:50% !important;box-sizing:border-box;}blockquote .container,blockquote .container div,blockquote .container table {width:auto !important;min-width:0 !important;position:relative !important;}img {max-width:100%;}.border-outer,.border-middle,.border-inner,.inner,[title="separator"] {width:100% !important;}.innercell {padding:8px !important;}.palm-block {display:block !important;}td.palm-one-whole {display:inline-block !important;padding:0;}td.palm-one-whole:first-child:not(:only-child) {margin-bottom:16px;}td.hostname {padding-top:3px !important;}}@media only screen and (min-width:601px) {.preview-card {max-width:600px !important;}}@media only screen and (min-device-width :320px) and (max-device-width :568px),only screen and (min-device-width :768px) and (max-device-width :1024px),only screen and (max-device-width:640px),only screen and (max-device-width:667px),only screen and (max-width:480px){.container {width:100% !important;min-width:100% !important;}.p,.small,li,font[size="2"],font[size="3"] {font-size:1em !important;}}@media only screen and (min-device-width :320px) and (max-device-width :568px),only screen and (min-device-width :768px) and (max-device-width :1024px),only screen and (min-device-width :1224px)  {.message-wrapper {padding-top:6px;}.apple-only[style] {display:block !important;max-height:none !important;line-height:normal !important;overflow:visible !important;height:auto !important;width:100% !important;position:relative !important;}.no-apple {display:none !important;}form {font-size:inherit;}input[type="text"] {height:43px;padding-left:4px !important;}button:hover {cursor:pointer;}}@media only screen and (min-device-width :1224px)  {.apple-mail-form {display:block !important;background-color:white !important;}}* [office365] .outlook-com-hidden {display:none !important;}* [office365] .outlook-com-button {display:block;}* [office365] .outlook-com-only {display:block !important;max-height:none !important;line-height:normal !important;overflow:visible !important;height:auto !important;width:100% !important;position:relative !important;}.ExternalClass {width:100%;}.ExternalClass .outlook-com-button {display:block;}.ExternalClass button {height:auto;}.ExternalClass .outlook-com-hidden {display:none !important;}.ExternalClass .outlook-com-only {display:block !important;max-height:none !important;line-height:normal !important;overflow:visible !important;height:auto !important;width:100% !important;position:relative !important;}.ExternalClass .ecxlabels {display:none !important;}.ExternalClass .ecxlabels {display:none !important;}.ExternalClass .ecxarrow {display:none !important;}.ExternalClass cite >div + div {padding:0 0 4px 0;}.ExternalClass .h1 {padding-bottom:5px;}.ExternalClass .h2 {padding-bottom:5px;}.ExternalClass .h3 {padding-bottom:5px;}.ExternalClass [lang="brand-pinterest"] {width:280px !important;}</style> <!--[if (gte mso 9)|(IE)]>
    
    <style>
      a, body {
        font-family: 'Calibri', Arial, sans-serif;
      }
    
      img {
        border: none !important;
        -ms-interpolation-mode:bicubic;
      }
    
      td {
        mso-line-height-rule:exactly !important;
      }
    
      .mso-card-inner table {
        border-collapse: collapse !important;
        mso-table-lspace:0pt;
        mso-table-rspace:0pt;
        vertical-align: top;
      }
    
      .outlook-com-only {
        display: none !important;
        font-size: 0 !important;
      }
    
      #mso-one-whole {
        width: 100% !important;
      }
    
    
    
        .border-outer,
        .border-middle,
        .border-inner {
          border: none !important;
        }
    
        .border-middle,
        .border-inner {
          width: 100% !important;
        }
    
        .mso-border-outer,
        .mso-border-middle,
        .mso-border-inner {
          padding: 1px;
        }
    
        .mso-border-outer { background-color: rgb(245, 255, 255); }
        .mso-border-middle { background-color: rgb(223, 246, 255); }
        .mso-border-inner { background-color: rgb(153, 176, 225); }
    
    </style>
    
    <![endif]--> <table class="container" lang="container" dir="ltr" border="0" cellpadding="0" cellspacing="0" valign="top" style="width:100%;margin-top:6px"> <tr> <td valign="top" class="message-wrapper" style="line-height:1.31;color:#222;font-family:arial,sans-serif"> <!--[if mso]><table  border="0" cellpadding="0" cellspacing="0" valign="top" style="border-collapse:separate;"><tr><td valign="top"><![endif]--> <div><br></div><table border="0" cellpadding="0" cellspacing="0" style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:12.8px;width:1022px;margin-top:6px"><tbody><tr><td style="line-height:1.31;color:rgb(34,34,34)"><p>Hello everyone,</p><p><br></p><p>I am watching a talk on YouTube called <a href="https://www.youtube.com/watch?v=8t8fjkISjus">Wrangling Monad Transformer Stacks</a>.</p><p><br></p><p>The talk has the following code:</p><p><br></p><p><br></p><table cellpadding="0" cellspacing="0" style="border-width:1px;border-style:solid;border-color:rgb(245,255,255);border-radius:4px;width:576px;max-width:578px"><tbody><tr style="border:1px solid rgb(213,236,255);display:block;border-radius:3px"><td style="display:block;padding:8px;border-radius:2px;border-width:1px;border-style:solid;border-color:rgb(153,176,225);font-size:0px;vertical-align:top"><table cellpadding="0" cellspacing="0" width="100%" style="width:556px"><tbody><tr><td width="100%" style="font-family:proxima-nova,"Avenir Next","Segoe UI",Calibri,"Helvetica Neue",Helvetica,Arial,sans-serif;padding-top:6px;padding-bottom:8px;line-height:18px;font-size:13px;min-width:100%">code</td></tr></tbody></table><table cellpadding="0" cellspacing="0" width="1000" style="font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px;line-height:1.4;margin-bottom:0px;color:rgb(51,51,51);background-image:initial;background-position:initial;background-size:initial;background-repeat:initial;background-origin:initial;background-clip:initial;width:1000px !important"><tbody><tr><td style="font-family:arial,sans-serif;padding:0.5em 1em"><p>{-# LANGUAGE GeneralizedNewtypeDeriving -#}</p><p></p><p>module DBTrans where</p><p></p><p>newtype WithTrans a = WithTrans (WithDBConn a) deriving (Functor, Applicative, Monad)</p><p></p><p>inDBTrans :: WithTrans a -> WithConn a</p><p>inDBTrans = ...</p><p></p></td></tr></tbody></table><table width="100%" cellpadding="0" cellspacing="0" style="border-top:1px solid rgb(221,221,238);table-layout:fixed;min-width:100%"><tbody><tr><td style="padding-top:8px"><a href="https://mixmax.com/r/59ec918e83319a2a077ff18c"><img src="https://emailapps.mixmax.com/img/badge_mixmax.png" height="20"></a> <a href="https://mixmax.com/r/59ec918e83319a2a077ff18c">NOT USING MIXMAX YET?</a></td></tr></tbody></table></td></tr></tbody></table><p><br></p><p>The speaker mentions that by using a newtype, we can perform "access control". The function <b>inDBTrans</b> is "aware" that the type constructor <b>WithTrans</b> is simply a wrapper for <b>WithDBConn</b>, and that functions outside of the module are not privy to that information. </p><p><br></p><p></p><p><font color="#888888"></font></p><p></p><p>Out of necessity, the speaker has to assume a certain level of Haskell knowledge that I don't have, because I am confused as to what language principles would allow for <b>inDBTrans</b> to be used for access control.</p><p><br></p><p>I understand that a newtype declaration does create a new type from a "type safey" point of view; that a newtype declaration is required to have a single data constructor with a single (not named) field; and that, once the type-checking is done, the compiler can strip out the newtype wrapper and leave the underlying type (informally speaking, of course), but that still doesn't get me to <b>inDBTrans</b> can do access control.</p><p><br></p><p>Thank you for any help!</p></td></tr></tbody></table><div class="mixmax_signature">Steven Leiva<br>305.528.6038<br><a href="mailto:leiva.steven@gmail.com" target="_blank">leiva.steven@gmail.com</a><br><a href="http://www.linkedin.com/in/stevenleiva" target="_blank">http://www.linkedin.com/in/stevenleiva</a><br></div><img align="left" width="0" height="0" style="border:0;width:0px;height:0px" src="https://track.mixmax.com/api/track/v2/THQy50tx4l1QopGIV/i02bj5CbpFWbnBkblZXZ0NnLhZXalxmI/IyZy9mLsxWZrNXYoBUZmF2YtwGblt2chhmI/ISZmF2YtwGblt2chhmI?sc=false" alt=""> <!--[if mso]></td></tr></table><![endif]--> </td> </tr> </table> </body> </html>