haskell lens

haskell - Cómo combinar lentes(no componer)



lens (1)

Se me acaba de ocurrir que no necesita ninguna sintaxis especial para combinar lentes. Si está creando lentes utilizando Template Haskell (que debería estar haciendo), entonces ya tiene captadores primitivos para cada campo, precedidos por un guión bajo.

Por lo tanto, podría utilizar los captadores primitivos para crear su recaudador de cost fantasma de la siguiente manera:

{-# LANGUAGE TemplateHaskell #-} import Control.Lens data Item = Item { _quantity :: Double , _price :: Double } $(makeLenses ''''Item) cost :: Getter Item Double cost = to $ (*) <$> _quantity <*> _price item :: Item item = Item { _quantity = 2, _price = 5.0 } main :: IO () main = print $ view cost item

Sin embargo, si no tiene acceso a los captadores primitivos, puede definir el cost como:

cost :: Getter Item Double cost = to $ (*) <$> view quantity <*> view price

Sus dedos no necesitan alejarse demasiado de la fila de inicio para escribir la view .

En haskell sin lentes puedo hacer cosas como:

data Item = Item { quantity :: Double, price ::Double } cost :: Item -> Double cost = (*) <$> quantity <*> price

Si uso lentes, ¿cómo puedo hacer el equivalente? Lo mejor que puedo hacer es

cost = to $ (*) <$> (^. quantity) <*> (^. price)

¿Hay alguna manera mejor? (por supuesto quiero un getter o equivalente)