Changelog

Higher-kinded quantification

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
{-# LANGUAGE ImpredicativeTypes #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}

import Control.Exception

data Iterator i o m a where
   NeedInput  :: (i -> Iterator i o m a) -> Iterator i o m a
   HasOutput  ::  o -> Iterator i o m a  -> Iterator i o m a
   NeedAction ::  m   (Iterator i o m a) -> Iterator i o m a
   IsDone     ::  a                      -> Iterator i o m a
   Error      ::  SomeException          -> Iterator i o m a

feedPure :: [i] -> Iterator i o (forall m . m) a -> Iterator i o (forall m . m) a
feedPure = loop
  where
    loop []     iter = iter
    loop (i:is) (NeedInput k)    = loop is (k i)
    loop is     (HasOutput o k0) = HasOutput o (loop is k0)
    loop is     (NeedAction m)   = undefined
    loop _      (IsDone a)       = IsDone a
    loop _      (Error err)      = Error err

{-
impredicative.hs:14:34:
    Kind mis-match
    The third argument of `Iterator' should have kind `* -> *',
    but `m' has kind `*'
    In the type signature for `feedPure':
      feedPure :: [i]
                  -> Iterator i o (forall m. m) a -> Iterator i o (forall m. m) -}


feedPure' :: [i] -> Iterator i o (forall m . (m :: * -> *)) a -> Iterator i o (forall m . (m :: * -> *)) a
feedPure' = loop
  where
    loop []     iter = iter
    loop (i:is) (NeedInput k)    = loop is (k i)
    loop is     (HasOutput o k0) = HasOutput o (loop is k0)
    loop is     (NeedAction m)   = undefined
    loop _      (IsDone a)       = IsDone a
    loop _      (Error err)      = Error err

{-
impredicative.hs:34:46:
    `(m :: * -> *)' is not applied to enough type arguments
    Expected kind `*', but `(m :: * -> *)' has kind `* -> *'
    In the type signature for `feedPure'':
      feedPure' :: [i]
                   -> Iterator i o (forall m. (m :: * -> *)) a
                      -> Iterator i o (forall m. (m :: * -> *)) a
-}