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 实例(例如:[a]、Maybe a、(y -> a)),但不能为消耗类型的数据类型编写,现在在上面的数据类型中它消耗了一个消耗 a 的函数,那么这种间接消耗如何被视为产生类型 a。这意味着我们不能为 (k -> a) -> k 写入 Functor 实例吗?
我该如何阅读 Cont 数据类型。当有 a 时,Cont 会产生 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