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)