我目前正在Haskell中编写一个编译器作为玩具项目,我有一个函数可以使用签名进行状态转换:
transform :: (Exp -> m Exp) -> Exp -> m Exp
这允许我在其上实现以下类型的操作:
但不知何故,即使这一定非常简单,我仍然坚持根据上述具有以下特征的转换方法创建无状态映射函数:
map :: (Exp -> Exp) -> Exp -> Exp
我宁愿不再对如何遍历地图中的子项进行相同的逻辑,而是在变换的基础上实现它。
答案 0 :(得分:5)
如果这是transform
的实际类型,那么您应该可以执行以下操作:
Control.Monad.Identity> :t transform
transform :: (Exp -> m Exp) -> Exp -> m Exp
Control.Monad.Identity> :t \f -> runIdentity . transform (Identity . f)
\f -> runIdentity . transform (Identity . f)
:: (Exp -> Exp) -> Exp -> Exp
但是,您可能在m
上有其他约束而未在可能排除Identity
的问题中写入。