gpt4 book ai didi

haskell - 自动生成镜头中的类型类的文档在哪里?

转载 作者:行者123 更新时间:2023-12-02 16:57:38 24 4
gpt4 key购买 nike

我正在查看此 blog post 中的倒数第二个示例(也是 here ),在验证它运行后,似乎证实了lens可以生成Has类型类,我认为这是博客作者的暗示。但是,我想念在lens contents中描述这一点的地方。或lens tutorial 。官方文档之外的任何关于如何完成此操作的解释也将受到欢迎。但看起来这可能只是使用最基本功能(makeLenses,或在本例中为makeLensesWith)时的标准。

这是复制的代码:

#!/usr/bin/env stack
-- stack --resolver lts-8.12 script
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
import Control.Concurrent.Async.Lifted.Safe
import Control.Monad.Reader
import Control.Concurrent.STM
import Say
import Control.Lens
import Prelude hiding (log)

data Env = Env
{ envLog :: !(String -> IO ())
, envBalance :: !(TVar Int)
}

makeLensesWith camelCaseFields ''Env

modify :: (MonadReader env m, HasBalance env (TVar Int), MonadIO m)
=> (Int -> Int)
-> m ()
modify f = do
env <- ask
liftIO $ atomically $ modifyTVar' (env^.balance) f

logSomething :: (MonadReader env m, HasLog env (String -> IO ()), MonadIO m)
=> String
-> m ()
logSomething msg = do
env <- ask
liftIO $ (env^.log) msg

main :: IO ()
main = do
ref <- newTVarIO 4
let env = Env
{ envLog = sayString
, envBalance = ref
}
runReaderT
(concurrently
(modify (+ 1))
(logSomething "Increasing account balance"))
env
balance <- readTVarIO ref
sayString $ "Final balance: " ++ show balance

最佳答案

Fieldlens 一词,用于描述每个命名字段一个类的模式,允许多个记录具有相同的字段名称但(可选)不同的类型。因此,camelCaseFieldsmakeFieldOpticsdefaultFieldRules都在其名称中表示它们将生成这些HasFoo类,以通常的方式lens 的简洁风格。

makeClassy 生成名为Has*的类,但以数据类型命名,而不是记录字段,并且不遵循不同的模式.

上面的代码生成以下代码(用 -ddump-splices 显示):

    makeLensesWith camelCaseFields ''Env
======>
class HasBalance s a | s -> a where
balance :: Lens' s a
instance HasBalance Env (TVar Int) where
{-# INLINE balance #-}
balance f_a4eTr (Env x1_a4eTs x2_a4eTt)
= (fmap (\ y1_a4eTu -> (Env x1_a4eTs) y1_a4eTu)) (f_a4eTr x2_a4eTt)
class HasLog s a | s -> a where
log :: Lens' s a
instance HasLog Env (String -> IO ()) where
{-# INLINE log #-}
log f_a4eTx (Env x1_a4eTy x2_a4eTz)
= (fmap (\ y1_a4eTA -> (Env y1_a4eTA) x2_a4eTz)) (f_a4eTx x1_a4eTy)

关于haskell - 自动生成镜头中的类型类的文档在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54857442/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com