标签: template-haskell

如何轻松查看Template Haskell语句的输出?

我的模块中有以下模板Haskell代码,它是更大的应用程序的一部分.

$(derive makeFoldable ''JStatement)
Run Code Online (Sandbox Code Playgroud)

我怀疑生成的Foldable实例并不是我最初的想法,但我找不到验证方法.那么,最好只使用ghci,是否可以查看生成的实例?

我尝试了以下内容并得到了语法错误,我猜这是因为我做错了.

> derive makeFoldable ''JStatement

<interactive>:1:21:
    lexical error in string/character literal at character '\''
Run Code Online (Sandbox Code Playgroud)

haskell metaprogramming ghc template-haskell

10
推荐指数
1
解决办法
476
查看次数

将模块恢复为记录

假设我有一个任意模块

module Foo where
foo :: Moo -> Goo
bar :: Car -> Far
baz :: Can -> Haz
Run Code Online (Sandbox Code Playgroud)

在哪里foo,barbaz,正确实施等

我想将此模块重新生成为自动生成的数据类型和相应的对象:

import Foo (Moo, Goo, Car, Far, Can, Haz)
import qualified Foo

data FooModule = Foo
  { foo :: Moo -> Goo
  , bar :: Car -> Far
  , baz :: Can -> Haz
  }

_Foo_ = Foo
  { foo = Foo.foo
  , bar = Foo.bar
  , baz = Foo.baz
  }
Run Code Online (Sandbox Code Playgroud)

名称必须与原始模块完全相同.

我可以手动执行此操作,但这非常繁琐,所以我想编写一些代码来为我执行此任务.

我不确定如何处理这样的任务.Template …

haskell module ghc-api template-haskell

10
推荐指数
1
解决办法
370
查看次数

如何使用`reify`获取函数的声明?

函数reify允许我查找有关给定名称的信息.对于函数,返回的值是VarI:

data Info = ... |  VarI Name Type (Maybe Dec) Fixity  | ...
Run Code Online (Sandbox Code Playgroud)

在这里,我可以检查函数的类型,我也想检查它的声明.但是,在VarI我总是看到的第三个论点中Nothing.有没有办法获得函数的声明?

haskell reify template-haskell

10
推荐指数
1
解决办法
246
查看次数

inline-c和language-c-inline之间有什么区别?

我一直在简要地研究Haskell的准引用库.这些库允许Haskell与其他语言集成.为了与C集成,似乎有两个具有类似功能的包:

由于我正在构建自己的准引用库,我对设计选择,API差异,性能等感兴趣.

我所知道的唯一区别是language-c-quote支持C和Objective-C,而inline-c支持C.

你会如何区分这些包裹?有什么根本区别?事实上,它们是否相似?

haskell ghc template-haskell

10
推荐指数
1
解决办法
705
查看次数

使用Template Haskell生成函数

是否可以使用Template Haskell定义函数?例如

convertStringToValue :: String -> Int
convertStringToValue "three" = 3
convertStringToValue "four" = 4
Run Code Online (Sandbox Code Playgroud)

我也有Map [Char] Int.

fromList [("five",5),("six",6)]
Run Code Online (Sandbox Code Playgroud)

我该如何添加功能

convertStringToValue "six" = 6
convertStringToValue "five" = 5
Run Code Online (Sandbox Code Playgroud)

在编译时使用Template Haskell和Map?使用Template Haskell来达到这个目的似乎很愚蠢,但我还是想知道.

haskell template-haskell

10
推荐指数
1
解决办法
574
查看次数

什么是$()构造?

我一直试图在Haskell参考中找到这个的用法:

getHomeR = defaultLayout $ do
    setTitle "My Awesome Site"
    $(widgetFile "home")
Run Code Online (Sandbox Code Playgroud)

特别:

$(widgetFile "home")
Run Code Online (Sandbox Code Playgroud)

我知道$运算符优先于它的右边,但是我无法理解$()的用法.任何人?

haskell syntactic-sugar template-haskell

10
推荐指数
1
解决办法
220
查看次数

通过利用多个类型类实例之间的对称来缩短代码

上下文

我正在编写一个代表SI前缀的Haskell模块:

module Unit.SI.Prefix where
Run Code Online (Sandbox Code Playgroud)

每个SI前缀都有相应的数据类型:

data Kilo = Kilo deriving Show
data Mega = Mega deriving Show
data Giga = Giga deriving Show
data Tera = Tera deriving Show

-- remaining prefixes omitted for brevity
Run Code Online (Sandbox Code Playgroud)

问题

我想编写一个函数,当应用两个SI前缀时,静态确定两个前缀中的哪一个更小.例如:

-- should compile:
test1 = let Kilo = smaller Kilo Giga in ()
test2 = let Kilo = smaller Giga Kilo in ()

-- should fail to compile:
test3 = let Giga = smaller Kilo Giga in () …
Run Code Online (Sandbox Code Playgroud)

haskell typeclass functional-dependencies template-haskell

9
推荐指数
1
解决办法
329
查看次数

模板Haskell与记录字段名称作为变量?

我有以下代码实现monad.我正在尝试使用它来简化以后使用更复杂逻辑的字段设置.

data Rec = Rec {
    alpha :: Int,
    beta  :: Double,
} deriving (Show)
defaultRec = Rec 0 0 0

data Record r = Record { runRecord :: Rec -> (Rec, r) }
instance Monad Record where
    return r = Record $ \s -> (s, r)
    a >>= b  = Record $ \s -> let (q, r) = runRecord a s in runRecord (b r) q

createRecord f = fst $ runRecord f defaultRec

changeAlpha x  = Record $ …
Run Code Online (Sandbox Code Playgroud)

haskell template-haskell

9
推荐指数
1
解决办法
753
查看次数

使用Template Haskell在编译时评估函数

我正在编写一个简单的HashString类,它只是一个字符串及其哈希:

data HashString = HashString Int    -- ^ hash
                             T.Text -- ^ string!
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试在编译时使用以下内容生成这些:

$(hString "hello, world") :: HashString
Run Code Online (Sandbox Code Playgroud)

我想要哈希,文本打包在编译时发生.我该怎么做呢?

这是我到目前为止所尝试的,但我不确定它是否正确,我也不确定它是否在编译时完成了所有工作:

hString :: String -> Q Exp
hString s = [| HashString (hash $ T.pack s) (T.pack s) |]
Run Code Online (Sandbox Code Playgroud)

haskell template-haskell

9
推荐指数
1
解决办法
1181
查看次数

是否有(模板)Haskell库允许我使用各自的名称打印/转储一些本地绑定?

例如:

let x = 1 in putStrLn [dump|x, x+1|]
Run Code Online (Sandbox Code Playgroud)

会印出类似的东西

x=1, (x+1)=2
Run Code Online (Sandbox Code Playgroud)

即使目前没有这样的东西,是否有可能写出类似的东西?

haskell template-haskell

9
推荐指数
2
解决办法
411
查看次数