KV
Size: a a a
KV
KV
AA
AP
AP
AP
(b :: a -> c) слева в описании типа, это не аннотация "b — функция из значения типа a в значение типа с".b — функция из типа a в тип c"AP
Cons show End сделать можно, если как-то указать, что за тип будет на входе show. Без этого указания функцию нельзя будет ни к чему применитьAP
> data T a = Cons (a -> String)
> x = Cons show
> :t x
x :: Show a => T a
вот тут известно (сохранено в типе), что будет подано на вход showAP
> data T where Cons :: forall a. (a -> String) -> T
> x = Cons show
> :t x
x :: T
так тоже можно сделать, но применить show, сохранённый в x, просто так не получитсяAP
> showUsing (Cons f) = f
<interactive>:25:22: error:
• Couldn't match expected type ‘p’ with actual type ‘a -> String’
because type variable ‘a’ would escape its scope
...AP
a, чтобы восстановить тип fAP
AP
> data Showable where Item :: forall a. Show a => a -> Showable
> l = [Item (1 :: Int), Item "foo"]
> showAll = show . map (\(Item x) -> show x)
> showAll l
"[\"1\",\"\\\"foo\\\"\"]"AP
AP