ram*_*ion 7 haskell template-haskell
我刚刚开始使用模板 haskell。
我写了一个函数,它接受一个函数a -> [b]并为一个函数生成一个表达式b -> a:
{-# OPTIONS_GHC -Wall -Wextra -Werror #-}
module Surjection where
import Language.Haskell.TH
import Data.Traversable
surj :: (Show a, Show b, Bounded a, Enum a) => (a -> [b]) -> Q Exp -- Q (TExp (b -> a))
surj f = fmap (LamCaseE . concat) . -- \case
forM [minBound .. maxBound] $ \a -> do
Just aName <- lookupValueName (show a)
forM (f a) $ \b -> do
Just bName <- lookupValueName (show b)
return $ Match (ConP bName []) (NormalB (ConE aName)) [] -- $(bName) -> $(aName)
Run Code Online (Sandbox Code Playgroud)
这有效,但如果我能保证它返回该类型的函数,那就是让它返回 aQ (TExp (b -> a))而不是 a ,那就太好了Q Exp。
到目前为止,我所看到的有关生成类型化表达式的所有内容都使用拼接和准引号。有没有办法从模板 haskell 构造函数中生成它?
哦嘿,中有一个TExp :: Exp -> TExp a构造函数Language.Haskell.TH.Syntax,所以我可以使用它:
surj f = fmap (TExp . LamCaseE . concat) ...
Run Code Online (Sandbox Code Playgroud)
缺点是 指定的类型TExp仅在拼接时检查(有点像 C++ 模板),但这是 TH 固有的。
| 归档时间: |
|
| 查看次数: |
99 次 |
| 最近记录: |