-> a where
timings :: Control.Lens.Type.Lens' s a
{-# MINIMAL timings #-}
instance HasTimings (Env m) Timings
хуже/лучше
class Has field env where
obtain :: env -> field
grab :: forall field env m . (MonadReader env m, Has field env) => m field
grab = asks $ obtain @field
{-# INLINE grab #-}
?
временем компиляции и тем, что нужно затаскивать линзы (они всё равно затащутся)?
например, в подходе с линзами не нужно писать инстансы руками
Ещё вот такой вариант есть:
newtype Field (s :: Symbol) env = Field { unField :: env }
instance forall s f env . (HasField s env f) => Has f (Field s env) where
obtain :: Field s env -> f
obtain = getField @s . unField
{-# INLINE obtain #-}
data Env = Env
{ envInt :: !Int
, envString :: !String
} deriving (Has Int) via Field "envInt" Env
deriving (Has String) via Field "envString" Env
...
do =
...
-- это GHC.Records.getField
x <- getField @"envInt"
И ещё есть capability (и там сразу есть куча вот этих "стратегий") http://ix.io/2io8/hs
Сейчас пользуюсь подходом с линзами
возьми уже женерик линзы)
Обсуждают сегодня