mb1*_*b14 21 haskell haskell-lens
在没有镜头的haskell中,我可以做以下事情:
data Item = Item { quantity :: Double, price ::Double }
cost :: Item -> Double
cost = (*) <$> quantity <*> price
Run Code Online (Sandbox Code Playgroud)
如果我使用镜头,我该怎么做相同的?我能做的最好的是
cost = to $ (*) <$> (^. quantity) <*> (^. price)
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法 ?(当然我想要一个getter或同等的)
我只是想到你不需要任何特殊的语法来组合镜头。如果您使用 Template Haskell 创建镜头(您应该这样做),那么您已经为每个字段提供了原始 getter,前面有一个下划线。
因此,您可以使用原始 getter 来创建幻像costgetter,如下所示:
{-# 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
Run Code Online (Sandbox Code Playgroud)
但是,如果您无权访问原始 getter,那么您可以定义cost为:
cost :: Getter Item Double
cost = to $ (*) <$> view quantity <*> view price
Run Code Online (Sandbox Code Playgroud)
您的手指无需离开主行太远即可打字view。