haskell - 使用模板 Haskell 生成 TExp
问题描述
我刚刚开始使用模板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)
这行得通,但如果我能保证它返回该类型的函数,那就太好了,也就是说让它返回 aQ (TExp (b -> a))
而不是 a Q Exp
。
到目前为止,我所看到的关于生成类型化表达式的所有内容都使用拼接和准引号。有没有办法从模板haskell构造函数生成它?
解决方案
哦,嘿,有一个TExp :: Exp -> TExp a
构造函数,Language.Haskell.TH.Syntax
所以我可以使用它:
surj f = fmap (TExp . LamCaseE . concat) ...
有一个缺点是只在拼接时检查指定的类型TExp
(有点像 C++ 模板),但这是 TH 所固有的。
推荐阅读
- apache-kafka - KTable 无法从物化视图中获取数据
- android - 如何在for循环内同步执行firebase函数?
- c++ - SFML 视图 setCenter 与旋转
- java - 列表视图不使用 Firebase 填充
- amazon-web-services - AWS SES 电子邮件接收 - 550 邮箱未找到
- asp.net - 如何在我的 ASP.NET MVC 应用程序中遍历 ParseObject 集合?
- html - 通过括号更改字体颜色
- vue.js - Vue中通过data属性传递函数引用
- java - 需要一种方法来打印适用于该程序的二维数组
- php - 门票 3.12A PHP 线路问题