标签: template-haskell

如何根据另一个准引用者编写一个准引用者

例如,如果我正在与第三方准引用者合作,thirdParty :: QuasiQuoter并且我想根据该准引用者编写自己的内容,我该怎么做?在 ghci 我尝试过

runQ [| [thirdParty| |] |]
Run Code Online (Sandbox Code Playgroud)

但这输出(就我而言):

LamE [VarP _render_2] (AppE (VarE GHC.Base.return) (ConE GHC.Tuple.()))
Run Code Online (Sandbox Code Playgroud)

这并没有告诉我“[thirdParty | |]”的抽象语法树是什么,所以我似乎无法使用模板Haskell构建这样的模式。

haskell template-haskell

5
推荐指数
1
解决办法
75
查看次数

Haskell 单例:typelits 包

我很难让编译器相信我的类型是正确的。Nat对于带有Zero和构造函数的常规\n 来说,Succ这非常简单(目标是replicate为长度索引列表编写函数(Vect ) 编写函数):

\n\n
replicate' :: SNat n -> a -> Vect n a\nreplicate' SZero _ = Nil\nreplicate' (SSucc n) a = a :> replicate' n a\n
Run Code Online (Sandbox Code Playgroud)\n\n

但经常Nat非常慢。

\n\n

因此,在单例库中有一个镜像 GHC.TypeLits 的包,以实现更快的 Nats。\n但我无法使上面的示例与它一起使用:

\n\n
sameNat :: forall a b. (KnownNat a, KnownNat b) => SNat a -> SNat b -> Maybe (a :~: b)\nsameNat x y\n  | natVal (Proxy :: Proxy a) == natVal (Proxy :: Proxy …
Run Code Online (Sandbox Code Playgroud)

haskell dependent-type template-haskell singleton-type

5
推荐指数
1
解决办法
540
查看次数

是否有功能/库/技术可以帮助为 TH 生成的实例生成正确/非冗余的上下文?

是否有一个函数可以接受给定的上下文/[Pred]并简化它?

我的意思的一些例子:

  • 如果上下文包含Eq [a]将其替换为Eq a(因为它意味着更复杂的约束)
  • 如果上下文包含 Eq Int,过滤掉
  • 删除重复项

用例:我已经实现了TH 函数来派生实例,而这些实例又使用类似的东西fmap它们需要上下文之,并且我想生成不会生成冗余约束警告的实例。

我已经做了一个simplifyContext :: [Pred] -> Q [Pred]助手来做到这一点,但在我看来这听起来像是一个普遍的需求,我希望这可能已经存在于某个图书馆中,但我已经尝试找到它但还没有。或者,如果它不存在,那可能是因为我缺少一种更简单的技术..

haskell typeclass template-haskell

5
推荐指数
0
解决办法
36
查看次数

如何收集分布在 Haskell 代码库中的值

我有一个用 Haskell 编写的 Web 应用程序(在客户端使用 ghcjs,在服务器端使用 ghc),我需要一种方法来收集分布在整个模块中的 CSS 值。目前我使用涉及类和模板 haskell 的技术CssStyle。当模块需要导出某些 CSS 时,它会CssStyle为某种类型创建一个实例(该类型没有任何意义,只是它必须是唯一的。)在顶层,所有实例都是使用模板 haskell 中的函数CssStyle检索的。reifyInstances

这种方法至少有两个缺点:您必须创建无意义的类型来附加实例,并且必须确保所有实例都导入到您扫描并转换为真实 CSS 的位置。谁能想到一种更漂亮的方式来收集嵌入 Haskell 代码中的数据?

===============

Quelklef 请求了一些演示当前解决方案的源代码:

{-# LANGUAGE AllowAmbiguousTypes, OverloadedStrings, MultiParamTypeClasses, TemplateHaskell, LambdaCase, FunctionalDependencies, TypeApplications #-}

import Clay
import Control.Lens hiding ((&))
import Data.Proxy
import Language.Haskell.TH

class CssStyle a where cssStyle :: Css

-- | Collect all the in scope instances of CssStyle and turn them into
-- pairs that can be used to build scss …
Run Code Online (Sandbox Code Playgroud)

haskell ghc template-haskell

5
推荐指数
1
解决办法
203
查看次数

Haskell是否有记录成员的指针/引用?

我可以创建和参考相对指针为结构用C++成员使用::*,.*->*语法,如:

char* fstab_t::*field = &fstab_t::fs_vfstype;
my_fstab.*field = ...
Run Code Online (Sandbox Code Playgroud)

在Haskell中,我可以轻松地为记录getter创建临时标签,例如:

(idxF_s,idxL_s) = swap_by_sign sgn (idxF,idxL) ;
Run Code Online (Sandbox Code Playgroud)

Afaik,然后我不能使用这些getter更新记录,如:

a { idxF_s = idxL_s b }
Run Code Online (Sandbox Code Playgroud)

是否有一种简单的方法可以在不编码每个记录设置器的情况下执行此操作

haskell member-pointers template-haskell

4
推荐指数
2
解决办法
511
查看次数

在模板haskell范围之外编译时间代码重写?

是否有可能创建一个函数,在编译时从模板haskell引号外部重写haskell代码?

例如:

differentiate :: Floating a => (a -> a) -> a -> (a,a)
differentiate = -- what goes here?

f :: Num a => a -> a
f = sin

g :: Num a => a -> (a,a)
g = differentiate f
Run Code Online (Sandbox Code Playgroud)

在编译时它会将g转换为:

g x = (sin x, cos x)
Run Code Online (Sandbox Code Playgroud)

我希望我的"区分"函数能够传递给"f"的AST并让我在编译之前重写它.据我所知,你不能在模板haskell中做到这一点,而不传递函数的完整语法,即"g =区分罪".

谢谢

haskell template-haskell

4
推荐指数
1
解决办法
240
查看次数

模板元编程的Haskell变体

我是Haskell的新手.鉴于Haskell的整个前提是函数将始终返回相同的值,我希望有一些方法可以在编译时计算常量的fibonacci值,就像我可以在C++中使用模板元编程一样,但我可以看不出怎么做.有办法吗?

haskell template-haskell

4
推荐指数
2
解决办法
350
查看次数

'mod'Haskell上的语法错误

我正在关注一个haskell教程:http://www.seas.upenn.edu/~cis194/lectures/01-intro.html

我正在测试ghci中的函数,我得到了这个部分:

hailstone :: Integer -> Integer
hailstone n
  | n `mod` 2 == 0 = n `div` 2
  | otherwise      = 3*n + 1
Run Code Online (Sandbox Code Playgroud)

我在.hs文件中有这个功能,我在同一个目录中启动ghci并执行:l hailstone.hs

输出是

Syntax error on 'mod'
    Perhaps you intended to use TemplateHaskell
    In the Template Haskell quotation 'mod'
Failed, modules loaded: none.
Run Code Online (Sandbox Code Playgroud)

做了一些谷歌搜索,试图加载这个'templatehaskell',最后得到一组不同的错误(http://brandon.si/code/working-with-template-haskell-in-ghci/)

haskell template-haskell

4
推荐指数
1
解决办法
4162
查看次数

使用makeClassy使用相同的字段名称制作镜头(TH)

这个问题是关于Edward A. Kmett的镜头包(版本4.13)

我有许多不同的data类型,所有类型都有一个字段,表示包含的最大元素数(业务规则受运行时更改,而不是集合实现问题.)我想capacity在所有情况下调用此字段,但我很快遇到命名空间冲突.

我在lens文档中看到有一个makeClassy模板,但我无法找到我理解的文档.这个模板功能是否允许我有多个具有相同字段名称的镜头?


EDITED:让我补充一点,我完全能够编码的周围的问题.我想知道是否makeClassy解决问题.

haskell template-haskell haskell-lens

4
推荐指数
1
解决办法
627
查看次数

如何明确调用haskell语法的quasiquoter?

我正在HaTeX之上构建一个eDSL.我面临的问题是我想在我的LaTeX文档中显示Haskell表达式,并且我想使用相同的Haskell表达式来帮助生成文档.

显而易见的答案是复制并粘贴表达式,使其显示为引用和实时.我想避免这种情况,因为表达式可能会发生变化.

我想象的是一个准引号,它既可以拼接其内容,也可以输出代表它的字符串.

例如,以下是我要输入的内容:

document = do
    title "this is an example document"
    paragraph "This is normal text. We will now show the Haskell code that generates a table"
    [quoted| makeTable ["heading1","heading2"] ["cell1","cell2"] |]
Run Code Online (Sandbox Code Playgroud)

我希望准引言扩展到:

document = do
    title "this is an example document"
    paragraph "This is normal text. We will now show the Haskell code that generates a table"
    makeTable ["heading1","heading2"] ["cell1","cell2"]
    listing Haskell "makeTable [\"heading1\",\"heading2\"] [\"cell1\",\"cell2\"]"
Run Code Online (Sandbox Code Playgroud)

为此,我需要编写一个QuasiQuoter:

quoted :: QuasiQuoter
quoted = QuasiQuoter
     { quoteExp = \str -> …
Run Code Online (Sandbox Code Playgroud)

haskell template-haskell

4
推荐指数
1
解决办法
198
查看次数