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)
我不是 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。:-(