我想定义cpsRec
,但是我不能。
如果你有什么想法,请告诉我。
import Control.Monad.Trans.Cont (Cont)
type family ContRec r x where
ContRec r (a -> b) = a -> ContRec r b
ContRec r a = Cont r a
cpsRec :: (a -> b) -> (a -> ContRec r b)
cpsRec f a =
let fa = f a
in case fa of
(x -> y) -> cpsRec fa -- error!
_ -> pure fa -- error!
-- use case
addT :: Int -> Int -> Int -> Int
addT x y z = x + y + z
addCpsT :: Int -> Int -> Int -> Cont r Int
addCpsT = cpsRec addT
2条答案
按热度按时间g2ieeal71#
下面是
cpsRec
的一个实现示例,它适用于具有任意数量参数的函数:xdnvmnnf2#
我认为最合理的方法是为不同的arity定义一系列
cpsRec
函数:或者完全不用
cpsRec
辅助器,直接执行转换。一旦你看到了这个模式,就很容易把它转换成你想要的任何arity函数: