【发布时间】:2020-03-26 02:49:13
【问题描述】:
newtype Cont k a = Cont { runCont :: (a -> k) -> k }
instance Functor (Cont k) where
-- fmap :: (a -> b) -> (Cont k a) -> (Cont k b)
fmap f (Cont akTok) = Cont $ ???
我的疑惑:
我们只能将 Functor 实例写入任何可以产生类型 out 的数据类型(例如:[a]、Maybe a、(y -> a)),但不能写入使用类型的数据类型.现在在上面的数据类型中,它消耗了一个消耗 a 的函数,那么这种间接消耗如何被认为是产生了一个 a 类型。这意味着我们不能为 (k -> a) -> k 编写 Functor 实例?
如何读取 Cont 数据类型。 Cont 有 a 时会产生 k? (就像 Javascript XHR 回调在从服务器获取数据时产生 JSON 一样?)
如何为 Cont 数据类型编写 QuickCheck 测试用例
import Test.QuickCheck
import Test.QuickCheck.Checkers
import Test.QuickCheck.Classes
newtype Cont k a = Cont { runCont :: (a -> k) -> k }
instance Functor (Cont k) where
...
instance Applicative (Cont k) where
...
instance Monad (Cont k) where
...
instance (Arbitrary a, Arbitrary b) => Arbitrary (Cont k a) where
arbitrary = do
-- akTok <- arbitrary -- How to generate Arbitrary functions like this
return $ Cont akTok
instance (Eq k, Eq a) => EqProp (Cont k a) where
(=-=) = eq -- How can I test this equality
main :: IO ()
main = do
let trigger :: Cont ???
trigger = undefined
quickBatch $ functor trigger
quickBatch $ applicative trigger
quickBatch $ monad trigger
【问题讨论】:
-
看看Haskell Wikibook chapter on continuations——这是对这个主题的一个很好的介绍。
标签: haskell continuations quickcheck continuation-passing