<div dir="ltr">Hi Anthony,<div><br></div><div>Please see my comments below.<br><div class="gmail_extra"><br><div class="gmail_quote">On 16 February 2017 at 02:31, Anthony Clayden <span dir="ltr"><<a href="mailto:anthony_clayden@clear.net.nz" target="_blank">anthony_clayden@clear.net.nz</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="gmail-">> On Tue, 14 Feb 2017 at 18:50, Harendra Kumar said:<br><br>
</span>Hi Harendra. I believe rawr builds on some of the work in<br>
'overloaded records'.<br></blockquote><div><br></div><div>I am aware of the ghc "overloaded records" proposal. rawr provides anonymous extensible records using the overloaded labels feature of ghc 8. Records can be merged or partitioned. I believe, the key difference between "overloaded records" and rawr is that the latter provides extensible records while the former does not. Though overloaded records can match a record based on the fields it contains.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
It's not clear what you're trying to do.<br>
Do you need anonymous/extensible records?<br></blockquote><div><br></div><div>I am trying to write a program which provides a friendly high level DSL to the user. I want a pure function like API but instead of passing positional parameters I want the user to be able to specify arguments based on keywords and be able to skip any optional arguments. Something like the following, name is mandatory and email is optional:</div><div><br></div><div>maintainer  (#name  := "Harendra Kumar",  #email := "<a href="mailto:xyz@gmail.com">xyz@gmail.com</a>")</div><div><br></div><div>I can achieve this using rawr. The argument to the function is an anonymous record and we can pattern match partially using the mandatory fields in the record to statically check that those fields are present. The optional fields are then supplied by applying the user supplied record on a default record. Here is a full working program for this example (you will need the latest rawr from github):</div><div><br></div><div><div>{-# LANGUAGE FlexibleContexts    #-}</div><div>{-# LANGUAGE DataKinds #-}</div><div>{-# LANGUAGE OverloadedLabels #-}</div><div>{-# LANGUAGE ScopedTypeVariables#-}</div><div>{-# LANGUAGE TypeOperators#-}</div><div><br></div><div>import Data.Rawr</div><div><br></div><div>pr t = print $</div><div>    case (R t) of</div><div>        r@(P (_ := name :: "name" := String)) -> R (#email := "<a href="mailto:default@gmail.com">default@gmail.com</a>") :<= r</div><div><br></div><div>main = do</div><div>    -- both name and email are specified by the user.</div><div>    pr (#name  := "Harendra Kumar",  #email := "<a href="mailto:xyz@gmail.com">xyz@gmail.com</a>")</div><div><br></div><div>    -- only name is supplied by the user, the default value of the optional field "email" will be used</div><div>    pr (#name  := "Harendra Kumar")</div><div><br></div><div>    -- This will not compile since name is a mandatory field</div><div>    -- pr  (#email := "<a href="mailto:xyz@gmail.com">xyz@gmail.com</a>")</div></div><div><br></div><div><br></div><div>I am pretty sure that I am not writing python code in Haskell I was only trying to say that this is a pretty useful feature in python and I guess in some other imperative languages too. It allows you to write self documenting code where necessary. It will be nice if we have a way to achieve something like this.</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="gmail-">
></span>Like<br>
<br>
    data MyR = MyR { a :: Int, b :: String };<br>
<br>
If you want default values:<br>
<br>
    myRdef = MyR{ a = 0 };  -- don't have to give b<br>
<br>
Then bind some value, to incorp defaults.<br>
<br>
    r = myRdef { b = "hello" };   -- takes the defult for a<br>
<span class="gmail-"><br></span></blockquote><div> </div><div>This is the first approach that I tried, this is commonly used in many libraries. The only drawback with this is that I cannot enforce mandatory/optional fields statically. All fields are optional in this case.</div><div><br></div><div>-harendra</div></div></div></div></div>