Snap:编译的拼接代码示例

2024-02-09

我想我前段时间确实问过类似的问题,但由于 API 不稳定,没有得到回答。所以我一直在等待0.13的过去。我不确定提出类似问题是否正确......?

解释的替代方案是什么runChildrenWith(Text) and mapSplices在编译的拼接世界中? (这个组合好像是最常见的) 如果可能的话,我真的很感激一些代码示例。

如果我理解正确的话,我们将所有应用程序拼接放在一起,然后将它们添加到heistInit。谁能告诉我该怎么做吗?

拼接绑定标签在整个应用程序中必须是唯一的吗?

有没有完成的snap项目utilising新的 API 和编译的拼接以便我可以阅读和学习?

谢谢。

- 更新 -

下面的答案很好。但不幸的是,有些部分(带镜头的部分)让我更加困惑。 如果我理解正确的话,这是拼接字符串的简单方法:

mySplice = "testSplice" ## testSplice
  where testSplice = return $ C.yieldRuntimeText $ do
          return "text to be spliced"

如果我需要多次运行分割的字符串,比如在 5 个表行中,我会这样做:

mySplices = C.manyWithSplices C.runChildren mySplice

它是否正确?

我尝试在抢劫配置中添加拼接时遇到一堆错误。

addConfig h $ mempty
 {
   hcCompiledSplices = "mySplice" ## mySplice -- or mySplices
 }

我哪里出错了?抱歉慢了。

我真正需要的(只是现在我可以理解)是拼接并显示我从数据库收到的简单字符串。

-- 更新 2 --

感谢非常有帮助的丹尼尔的回答,我终于可以开始工作了。

到目前为止,我已经使两种代码变体都可以工作了。

第一个,感谢丹尼尔

stringSplice :: Monad n => C.Splice n
stringSplice = C.manyWithSplices C.runChildren splicefuncs (return ["aa","bb","cc"])
  where
    splicefuncs = "string" ## (C.pureSplice . C.textSplice $ id)

还有第二个

testSplice :: C.Splice (Handler App App)
testSplice = return $ C.yieldRuntimeText $ return "text to be spliced"

Where

(C.pureSplice . C.textSplice $ id)

产生类似的结果

return $ C.yieldRuntimeText $ return "text to be spliced"

上面的有区别吗?在任何情况下,人们会更喜欢其中一种而不是另一种吗?它们似乎产生相同的结果。

编译的 splices 库中有一个“deferMany”函数,根据文档,它产生与解释的库中的 mapSplices 类似的结果。 我们可以使用它来代替“C.manyWithSplices C.runChildren”组合吗?


假设您想要显示有关使用编译拼接的人员列表的信息(假设我们从由snap init.)

一个非常简单的_persons.tpl具有虚拟值的模板类似于

<body>
    <person>
        <div>
            <h1><name>dummy name</name></h1>
            <p><age>77</age></p> 
            <p><location>jauja</location></p> 
        </div>
    </person>
</body>

Where person, name, age, and location是要拼接的标签。

我们定义一个简单的 Snaplet 来保存信息

data Foo = Foo
    {
        _persons :: [Person]
    }

makeLenses ''Foo

data Person = Person
    {
        _name :: Text
    ,   _age :: Int
    ,   _location :: Text
    }   

makeLenses ''Person

我们将它添加到App record:

data App = App
    { _heist :: Snaplet (Heist App)
    , _sess :: Snaplet SessionManager
    , _auth :: Snaplet (AuthManager App)
    , _foo :: Snaplet Foo
    }

我们将以下内容添加到应用程序初始化程序中

f <- nestSnaplet "foo" foo $ makeSnaplet "foo" "Foo Snaplet" Nothing $ return $ Foo $ 
        [ Person "Ricardo" 33 "Los Cantones" 
        , Person "Luis" 38 "Montealto" 
        ]

...

return $ App h s a f

该函数构造一个返回人员列表的处理程序(使用view from Control.Lens):

personH :: SnapletLens b Foo -> Handler b b [Person] 
personH l = withTop l $ view persons <$> get 

该函数从一个构造适当的编译器拼接RuntimeSplice产生一个人员列表。RuntimeSplices 表示只能在运行时而不是加载时才能知道的信息:

personSplice :: Monad n => RuntimeSplice n [Person] -> C.Splice n
personSplice = C.manyWithSplices C.runChildren splicefuncs 
    where
    splicefuncs = mconcat  
        [ "name" ## (C.pureSplice . C.textSplice $ view name)
        , "age" ## (C.pureSplice . C.textSplice $ T.pack . show . view age)
        , "location" ## (C.pureSplice . C.textSplice $ view location)
        ]

此功能可用于在全局 Heist 配置中注册拼接。请注意,我们举起了Handler into a RuntimeSplice:

addPersonSplices :: HasHeist b => Snaplet (Heist b) -> 
                                  SnapletLens b Foo -> 
                                  Initializer b v ()
addPersonSplices h l = addConfig h $ mempty 
   {
      hcCompiledSplices = "person" ## (personSplice . lift $ personH l) 
   } 

请务必将此行添加到应用程序初始值设定项中:

addPersonSplices h foo

并将以下对添加到应用程序的路由中:

("/persons",  cRender "_persons")

如果您现在运行服务器,请导航到http://127.0.0.1:8000/persons应该显示列表。

UPDATE

对于更简单的情况(没有复杂的记录,没有镜头),您只想显示字符串列表。

模板可能是这样的:

<body>
    <strings>
        <p><string>dummy value</string></p>
    </strings>
</body>

顶层拼接将是:

stringSplice :: Monad n => C.Splice n
stringSplice = C.manyWithSplices C.runChildren splicefuncs (return ["aa","bb","cc"])
    where
    splicefuncs = "string" ## (C.pureSplice . C.textSplice $ id)

这意味着“当我们遇到与此拼接关联的标签时,执行一个生成字符串列表的操作,并为每个字符串呈现标签的内容,用当前字符串替换string tag".

请注意,签名多带拼接 http://hackage.haskell.org/package/heist-0.13.0.2/docs/Heist-Compiled.html#v:manyWithSplices迫使东西在右边(##)有类型RuntimeSplice n Text -> Splice n. Here id有类型Text -> Text. C.TextSplice将其转化为某种类型的东西Text -> Builder, and C.pureSplice执行最终转换为RuntimeSplice n Text -> Splice n.

代替(return ["aa","bb","cc"])您可以提供一个更复杂的操作来连接数据库并从那里提取字符串。

注册该拼接的函数是:

addStringSplices :: HasHeist b => Snaplet (Heist b) -> Initializer b v ()
addStringSplices h = addConfig h $ mempty 
    {
          hcCompiledSplices = "strings" ## stringSplice
    }  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Snap:编译的拼接代码示例 的相关文章

  • Haskell,optparse-generic 的未命名命令行参数

    我在用着optparse 通用 https hackage haskell org package optparse generic解析名为的程序的命令行参数example 我有一个带有命名字段的数据类型 记录语法 例如 data Exam
  • 使用 nix 在 Mac OS X 上由于“架构 x86_64 的未定义符号”而导致“堆栈构建”失败

    首先是错误消息 stack build Linking Users yuzhao stack setup exe cache x86 64 osx tmp Cabal simple mPHDZzAJ 2 2 0 1 ghc 8 4 4 cl
  • Haskell 中的前提条件检查有哪些选项

    这是一个简单的问题 我认为答案很复杂 一个非常常见的编程问题是函数返回某些内容 或者前置条件检查失败 在Java中 我会使用一些抛出异常的断言函数IllegalArgumentException在方法的开头 如下所示 method body
  • 在 Haskell 中计算移动平均线

    我正在学习 Haskell 所以我尝试实现移动平均函数 这是我的代码 mAverage Int gt Int gt Float mAverage x a fromIntegral k fromIntegral x k lt rawAvera
  • 在 Haskell 中增长数组

    我想在 Haskell 中实现以下 命令式 算法 给定一个序列对 e0 s0 e1 s1 e2 s2 en sn 其中 e 和 s 部分不一定是自然数不同的是 在每个时间步都会随机选择该序列的一个元素 例如 ei si 并根据 ei si
  • Haskell 类型系统的细微差别

    我一直在深入了解 haskell 类型系统的本质 并试图了解类型类的要点 我已经学到了很多东西 但我在下面的代码片段上遇到了困难 使用这些类和实例定义 class Show a gt C a where f Int gt a instanc
  • Haskell 下划线与显式变量

    我已经学习 Haskell 几个星期了 我有一个关于下划线的使用的问题 作为函数参数 我认为用一个具体的例子来问我的问题会更好 假设我想定义一个函数 根据提供的索引提取列表的元素 是的 我意识到 已经是预先定义的 我可以定义该函数的两种方法
  • 我应该在 Turtle 或 Foldl 包中使用折叠吗?

    我在使用 Turtle 时遇到了一些困难 直到盯着难以理解的错误消息几分钟后才意识到我使用了错误的fold功能 https hackage haskell org package turtle 1 5 8 docs Turtle Shell
  • 在 Haskell 中,为什么我必须在这段代码中使用美元符号?

    我仍在尝试破解这段代码 import Data Char groupsOf groupsOf n xs take n xs groupsOf n tail xs problem 8 x maximum map product groupsO
  • Haskell 中的 print 是纯函数吗?

    Is print在 Haskell 中是纯函数 为什么或者为什么不 我认为不是 因为它并不总是返回与纯函数应返回的值相同的值 类型的值IO Int并不是真正的Int 它更像是一张纸 上面写着 嘿 Haskell 运行时 请生成一个Int如此
  • Haskell:是的,没有类型类。为什么是整数?

    我有一个关于 GHCi 如何假定整数类型的问题 我正在阅读 Learn you a Haskell 是 否类型的课程 如果您想阅读全文 这里有一个链接 http learnyouahaskell com making our own typ
  • 使用 FoldLine 解析多个块

    对于这个简化的问题 我试图解析一个如下所示的输入 foo bar baz quux woo hoo xyzzy glulx into foo bar baz quux woo hoo xyzzy glulx 我尝试过的代码如下 import
  • Haskell 入门

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 几天来 我一直试图理解 Haskell 中的函数式编程范例 我通过阅读教程和观看截屏视频
  • 标准的能力

    我发现了一些使用标准的旧例子here http www serpentine com blog 2009 09 29 criterion a new benchmarking library for haskell 看起来好像早在 2009
  • Haskell / GHC - 是否有“警告不完整模式”的中缀标签/编译指示

    我正在寻找一个可以对特定的不完整模式发出警告的编译指示 它会使编译器失败并显示以下 假设的 代码 FAILIF incomplete patterns f Int gt Int f 0 0 我正在尝试使用 Arrows 编写一个 编译器 并
  • : 中缀运算符在 Haskell 中的作用是什么?

    我正在阅读Haskell 简要介绍 http www haskell org tutorial index html 这不是那么温和 并且它反复使用 操作符而不直接解释它的作用 那么 它到底有什么作用呢 是 前置 运算符 x xs 返回一个
  • 这个对自身单位的列表理解是如何工作的?

    在 haskell IRC 频道中有人问 是否有一种简洁的方法来定义一个列表 其中第 n 个条目是之前所有条目的平方和 我认为这听起来像一个有趣的谜题 递归定义无限列表是我真正需要练习的事情之一 所以我启动了 GHCi 并开始尝试递归定义
  • Haskell - lambda 表达式

    我试图了解什么是有用的以及如何在 Haskell 中实际使用 lambda 表达式 我不太明白使用 lambda 表达式相对于定义函数的约定方式有何优势 例如 我通常会执行以下操作 let add x y x y 我可以简单地打电话 add
  • 为什么 ZipList 不是 List 的默认应用实例

    我目前正在学习 Haskell 中的应用程序 如果我没记错的话 列表有两个不同的应用实例 List and ZipList 第二个被定义为包装列表值的新类型 这ZipList应用实例对我来说似乎更直观 这可能是一个愚蠢的问题 但有具体原因吗
  • 如何通过“cabal build”或“stack build”构建带有图标的项目

    我想构建一个带有图标的可执行文件 通过谷歌搜索 我发现这里的说明 https wiki haskell org Setting an executable icon 但它只能通过编译源文件来工作ghc 如果我想构建一个具有可执行文件的项目c

随机推荐

  • Page.IsValid 和 args.IsValid 之间有什么关系

    Page IsValid 和 args IsValid 是否相互依赖 我的意思是 如果 args IsValid true 则 Page IsValid 必须为 true 当然 反之亦然 如果 Page IsValid true 那么 ar
  • 尾随零不会进入数据库

    所以这是我的问题 我们试图将定价放入我们的数据库中 但由于某种原因 它将 10 00 转换为 10 或 10 50 转换为 10 5 它保持它只是砍掉尾随零 我检查了 SQL 语句 它说价格 10 00 所以我真的很困惑为什么 在哪里它要剥
  • 黄瓜嵌入的屏幕截图不链接到屏幕截图

    从 Cukes Google Group 交叉发布 我尝试过多种保存截图的方法 但最终选择了 watir webdriver 中内置的方法 不 无论我使用哪种方法 我都无法成功嵌入 Cucumber HTML 报告中此图像的链接 在 c r
  • ggplot2 在函数或 S4 中使用时产生错误

    当在 function 或 S4 中使用 ggplot2 时 我遇到了困难 这是我的没有功能的代码 rm list ls all TRUE library nlme data Oats Data lt Oats Data Env lt fa
  • 当“以管理员身份运行”时,实例化 COM 组件失败并显示“类未注册”

    实例化 COM Interop 对象时 var comObj new ComComponentClass 我得到了COMException Retrieving the COM class factory for component wit
  • CocoaLumberjack FileLogger 记录到多个文件

    我正在使用这个 CocoaLumberjack 框架来记录 Objective C 设计中的所有消息 现在我想将所有错误记录到一个文件 并将所有其他消息记录到另一个文件 我知道我可以使用格式化程序来过滤这些信息 我在 AppDelegate
  • 实现 TextWriter 的派生类

    我有两个类 我无法以任何方式更改它们 第 1 类 采取TextWriter作为构造函数参数并将其用作输出流 类2 提供方法WriteLine string 我需要一个适配器 以便将 Class1 的所有输出写入 Class2 因此我启动了一
  • Builder 与 GlobalKey

    与构建 Flutter UI 相关的许多问题都归结为错误BuildContext 例如显示SnackBar 答案通常是使用Builder或使用GlobalKey 两者都有效 但我注意到文档全局密钥 https docs flutter io
  • 如何使用命令机器人框架执行bat文件(.bat)?

    我有一个 脚本文件 我想在机器人框架中执行这个脚本 我也在尝试这个 但对我来说没有任何作用 Run CURDIR script script bat 有人可以帮我吗 Use 工艺库 http robotframework org robot
  • 删除 SQL 表中的树节点

    我正在尝试编写一个递归过程 该过程将删除该节点及其所有子节点 如果它们在表中 我尝试执行以下操作 CREATE PROCEDURE DeleteFile FileID INTEGER UserID VARCHAR MAX AS DELETE
  • AG 网格 - 禁止在特定列/单元格内选择行

    使用 AG 网格 我需要制作一个在单击时选择行的表格 但是单击某些单元格不会导致选择该行 到目前为止 我最好的想法是当鼠标悬停在非选择单元格上时禁用单击行选择 就像是 gridOptions onCellMouseOver event gt
  • 命名空间“Mvc”的类型在命名空间“Microsoft.AspNet”中不存在

    我正在 Visual Studio 2015 中开发 MVC 项目 最初在 VS 2013 中创建 一切都构建正确 但在编码时 视图显示很多错误 ViewBag Title Index Layout Views Shared Layout
  • 如何使用批处理文件编辑特定的组策略

    我在一个学区的 700 多台计算机上工作 并编写了一个小程序 我打算将其写入 CD 该程序设置为插入磁盘时自动运行 并提示计算机的屏幕分辨率以及建筑物所在的计算机 不同的教学楼 然后 程序将运行一个批处理文件 将默认桌面从磁盘复制到 win
  • 在生产环境中部署 ReactJS 应用程序(使用 NodeJS 后端)

    我们的项目现已结束 我们只有两周的时间将项目归还给我们大学最后一年的学习 我们的老师告诉我们 现在开发阶段已经结束 我们必须将其部署到生产阶段 我们使用 ReactJS 作为前端 托管在 localhost 3000 使用 NodeJS 进
  • 对不同集合上匹配 id 的对象数组进行排序

    我有一个对象数组 array id 5 name Helen age 20 id 15 name Lucy age 30 id 7 name Carlos age 1 然后我有一个类似的数组 以不同的方式排序 arraySorted id
  • Google 云容器构建器并不总是从 bitbucket 触发

    我在 Google Cloud Container Builder 中设置了构建触发器 这些触发器设置为在特定分支上触发并使用存储库中的 cloudbuild yml 配置 大约在我将提交推送到这些分支的第一天 它触发了容器构建并成功完成
  • 使用 Go 将数据发送到 Datadog

    我使用 Go 收集数据并希望将其可视化 我选择了 Datadog 但没有找到 Go 用于向 Datadog 发送指标的示例或实时项目 但官方网站说支持Go 第一步是在运行应用程序的服务器上安装 DataDog 代理 https docs d
  • tableView didSelectRowAtIndexPath 在 iOS 7 上无法正常工作。为什么?

    首先我想说我只是提出这个问题 因为我想了解发生了什么 我在 Xcode5 上全新安装时打开了一个旧的 Xcode 项目 一个非常简单的项目 当我意识到它在 iOS 7 上不起作用时 为什么 不知道 我看到了一些其他问题 没有得到任何有用的答
  • Vue.js 组件不工作

    我似乎无法弄清楚如何使组件工作 如果没有该组件 它可以正常工作 注释代码 这是我的 HTML strong Total Price strong span span br strong CPC strong span span 这是我的 V
  • Snap:编译的拼接代码示例

    我想我前段时间确实问过类似的问题 但由于 API 不稳定 没有得到回答 所以我一直在等待0 13的过去 我不确定提出类似问题是否正确 解释的替代方案是什么runChildrenWith Text and mapSplices在编译的拼接世界