模板haskell中的拼接类型签名

Has*_*ush 8 haskell template-haskell

我正在尝试为模板haskell中的函数创建类型签名.有这么简单的方法吗?

在此期间我已经做了一些解决方法,但它应该更容易,对吧?

-- TH.hs
module Lib.TH (mkFunction) where

import Language.Haskell.TH

mkFunction n = do
  let name = mkName n
  [d|
    $( ... ) :: Integer -> Integer
    $(varP name) = \x -> x + 2|]

-- Other.hs
import TH

mkFunction "test"
Run Code Online (Sandbox Code Playgroud)

我应该在$( ... )上面写什么?我试过的一切都会产生

Invalid type signature: ... :: Integer -> Integer
Should be of form <variable> :: <type>
Run Code Online (Sandbox Code Playgroud)

luq*_*qui 4

我不是 TH 专家,但我通过深入研究文档并跟踪类型错误找到了一种方法。

import Language.Haskell.TH
import Control.Applicative ((<$>))

mkFunction n = do
    let name = mkName n
    [d|
        $( return . SigD name <$> [t| Integer -> Integer |] )
        $(varP name) = \x -> x + 2 |]
Run Code Online (Sandbox Code Playgroud)

我不知道是否有更干净的方法。

注意这适用于 7.8.3,但不适用于 7.10.2。:-(

  • 在 7.10.2 中,它会抛出以下编译错误:“声明括号内的拼接尚未由 Template Haskell 处理”? (3认同)