Send Beginners mailing list submissions to beginners@haskell.org To subscribe or unsubscribe via the World Wide Web, visit http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners or, via email, send a message with subject or body 'help' to beginners-requ...@haskell.org
You can reach the person managing the list at beginners-ow...@haskell.org When replying, please edit your Subject line so it is more specific than "Re: Contents of Beginners digest..." Today's Topics: 1. How would I increment or otherwise change a value in a record with ?Simon-ness? (Michael Litchard) 2. Re: How would I increment or otherwise change a value in a record with ?Simon-ness? (Sumit Sahrawat, Maths & Computing, IIT (BHU)) ---------------------------------------------------------------------- Message: 1 Date: Wed, 5 Aug 2015 14:22:59 -0700 From: Michael Litchard <mich...@schmong.org> To: "beginners@haskell.org" <beginners@haskell.org> Subject: [Haskell-beginners] How would I increment or otherwise change a value in a record with ?Simon-ness? Message-ID: <CAEzeKYpSBiCF9x3W2wR-6u9Ymm5vmAs=+lguwrsppstbhzs...@mail.gmail.com> Content-Type: text/plain; charset="utf-8" The below code is from this tutorial http://dev.stephendiehl.com/hask/ it illustrates very well how to operate on values from records with "Simon-ness" (illustrated below). What I am struggling with is how to modify values inside records with "Simon-ness", say incrementing "age". I keep thinking it has to do with the way Label is defined with the constructor Get. Could I add another constructor Put? {-# LANGUAGE DataKinds #-}{-# LANGUAGE KindSignatures #-}{-# LANGUAGE MultiParamTypeClasses #-}{-# LANGUAGE FunctionalDependencies #-}{-# LANGUAGE FlexibleInstances #-}{-# LANGUAGE FlexibleContexts #-}{-# LANGUAGE StandaloneDeriving #-}{-# LANGUAGE ExistentialQuantification #-}{-# LANGUAGE ConstraintKinds #-} import GHC.TypeLits newtype Field (n :: Symbol) v = Field { unField :: v } deriving Show data Person1 = Person1 { _age :: Field "age" Int , _name :: Field "name" String } data Person2 = Person2 { _age' :: Field "age" Int , _name' :: Field "name" String , _lib' :: Field "lib" String } deriving instance Show Person1deriving instance Show Person2 data Label (l :: Symbol) = Get class Has a l b | a l -> b where from :: a -> Label l -> b instance Has Person1 "age" Int where from (Person1 a _) _ = unField a instance Has Person1 "name" String where from (Person1 _ a) _ = unField a instance Has Person2 "age" Int where from (Person2 a _ _) _ = unField a instance Has Person2 "name" String where from (Person2 _ a _) _ = unField a age :: Has a "age" b => a -> b age pnt = from pnt (Get :: Label "age") name :: Has a "name" b => a -> b name pnt = from pnt (Get :: Label "name") -- Parameterized constraint kind for "Simon-ness" of a record.type Simon a = (Has a "name" String, Has a "age" Int) spj :: Person1 spj = Person1 (Field 56) (Field "Simon Peyton Jones") smarlow :: Person2 smarlow = Person2 (Field 38) (Field "Simon Marlow") (Field "rts") catNames :: (Simon a, Simon b) => a -> b -> String catNames a b = name a ++ name b addAges :: (Simon a, Simon b) => a -> b -> Int addAges a b = age a + age b names :: String names = name smarlow ++ "," ++ name spj-- "Simon Marlow,Simon Peyton Jones" ages :: Int ages = age spj + age smarlow-- 94 -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mail.haskell.org/pipermail/beginners/attachments/20150805/b97774b5/attachment-0001.html> ------------------------------ Message: 2 Date: Thu, 6 Aug 2015 02:54:52 +0530 From: "Sumit Sahrawat, Maths & Computing, IIT (BHU)" <sumit.sahrawat.ap...@iitbhu.ac.in> To: The Haskell-Beginners Mailing List - Discussion of primarily beginner-level topics related to Haskell <beginners@haskell.org>, Haskell-cafe Cafe <haskell-c...@haskell.org> Subject: Re: [Haskell-beginners] How would I increment or otherwise change a value in a record with ?Simon-ness? Message-ID: <cajbew8pi5kxys7ms+cxlwktg20m00wfvvw3ncuxge+szhyx...@mail.gmail.com> Content-Type: text/plain; charset="utf-8" More suitable for the haskell-cafe. Routing. On 6 August 2015 at 02:52, Michael Litchard <mich...@schmong.org> wrote: > > The below code is from this tutorial http://dev.stephendiehl.com/hask/ > > it illustrates very well how to operate on values from records with > "Simon-ness" (illustrated below). What I am struggling with is how to > modify values inside records with "Simon-ness", say incrementing "age". I > keep thinking it has to do with the way Label is defined with the > constructor Get. Could I add another constructor Put? > > {-# LANGUAGE DataKinds #-}{-# LANGUAGE KindSignatures #-}{-# LANGUAGE > MultiParamTypeClasses #-}{-# LANGUAGE FunctionalDependencies #-}{-# LANGUAGE > FlexibleInstances #-}{-# LANGUAGE FlexibleContexts #-}{-# LANGUAGE > StandaloneDeriving #-}{-# LANGUAGE ExistentialQuantification #-}{-# LANGUAGE > ConstraintKinds #-} > > import GHC.TypeLits > newtype Field (n :: Symbol) v = Field { unField :: v } deriving Show > data Person1 = Person1 > { _age :: Field "age" Int > , _name :: Field "name" String > } > data Person2 = Person2 > { _age' :: Field "age" Int > , _name' :: Field "name" String > , _lib' :: Field "lib" String > } > deriving instance Show Person1deriving instance Show Person2 > data Label (l :: Symbol) = Get > class Has a l b | a l -> b where > from :: a -> Label l -> b > instance Has Person1 "age" Int where > from (Person1 a _) _ = unField a > instance Has Person1 "name" String where > from (Person1 _ a) _ = unField a > instance Has Person2 "age" Int where > from (Person2 a _ _) _ = unField a > instance Has Person2 "name" String where > from (Person2 _ a _) _ = unField a > > age :: Has a "age" b => a -> b > age pnt = from pnt (Get :: Label "age") > > name :: Has a "name" b => a -> b > name pnt = from pnt (Get :: Label "name") > -- Parameterized constraint kind for "Simon-ness" of a record.type Simon a = > (Has a "name" String, Has a "age" Int) > > spj :: Person1 > spj = Person1 (Field 56) (Field "Simon Peyton Jones") > > smarlow :: Person2 > smarlow = Person2 (Field 38) (Field "Simon Marlow") (Field "rts") > > > catNames :: (Simon a, Simon b) => a -> b -> String > catNames a b = name a ++ name b > > addAges :: (Simon a, Simon b) => a -> b -> Int > addAges a b = age a + age b > > > names :: String > names = name smarlow ++ "," ++ name spj-- "Simon Marlow,Simon Peyton Jones" > > ages :: Int > ages = age spj + age smarlow-- 94 > > > _______________________________________________ > Beginners mailing list > Beginners@haskell.org > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners > > -- Regards Sumit Sahrawat -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mail.haskell.org/pipermail/beginners/attachments/20150806/d56406aa/attachment.html> ------------------------------ Subject: Digest Footer _______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners ------------------------------ End of Beginners Digest, Vol 86, Issue 3 ****************************************