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
, чтобы восстановить тип f
AP
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