-
-
Save deniok/a6f61ef1d4e31adfcf96780dd17e8c97 to your computer and use it in GitHub Desktop.
FP_HSE2020Fall_15Lens
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{-# LANGUAGE TemplateHaskell #-} | |
module Fp15Lens where | |
import Control.Lens (makeLenses) | |
{- | |
GHCi> :set -XTemplateHaskell | |
GHCi> import Language.Haskell.TH | |
GHCi> ast = runQ [| \x -> x |] | |
GHCi> ast | |
LamE [VarP x_0] (VarE x_0) | |
GHCi> runQ [t| IO Bool |] | |
AppT (ConT GHC.Types.IO) (ConT GHC.Types.Bool) | |
GHCi> runQ [d| f x = 42 |] | |
[FunD f_1 [Clause [VarP x_2] (NormalB (LitE (IntegerL 42))) []]] | |
GHCi> :t $(ast) | |
$(ast) :: p -> p | |
GHCi> $(ast) 42 | |
42 | |
GHCi> constNGen n = do {var <- newName "x"; return $ LamE [VarP var] (LitE (IntegerL n))} | |
GHCi> :t constNGen | |
constNGen :: Integer -> Q Exp | |
GHCi> $(constNGen 42) "Answer?" | |
42 | |
-} | |
data Arc = Arc { | |
_degree, _minute, _second :: Int | |
} deriving Show | |
data Loc = Loc { | |
_latitude, _longitude :: Arc | |
} deriving Show | |
-- символ подчеркивания в полях записи является конвенцией, принятой в Control.Lens для генерации линз с помощью TH. | |
-- TH создает нужные функции ... | |
$(makeLenses ''Loc) | |
-- ... а именно | |
-- latitude :: Lens' Loc Arc | |
-- longitude :: Lens' Loc Arc | |
-- рассахаренные типы такие | |
-- latitude :: Functor f => (Arc -> f Arc) -> Loc -> f Loc | |
$(makeLenses ''Arc) | |
-- degree :: Lens' Arc Int | |
-- minute :: Lens' Arc Int | |
-- second :: Lens' Arc Int | |
{- | |
--Times 59°58'50",30°19'27" | |
GHCi> timesLocation = Loc (Arc 59 58 50) (Arc 30 19 27) | |
GHCi> import Control.Lens | |
GHCi> timesLocation ^. latitude . degree | |
59 | |
GHCi> timesLocation & longitude . second .~ 39 | |
Loc {_latitude = Arc {_degree = 59, _minute = 58, _second = 50}, | |
_longitude = Arc {_degree = 30, _minute = 19, _second = 39}} | |
-} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment