Skip to content

Instantly share code, notes, and snippets.

@deniok
Created December 10, 2020 13:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save deniok/a6f61ef1d4e31adfcf96780dd17e8c97 to your computer and use it in GitHub Desktop.
Save deniok/a6f61ef1d4e31adfcf96780dd17e8c97 to your computer and use it in GitHub Desktop.
FP_HSE2020Fall_15Lens
{-# 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