haskell - How to give a type signature to polymorphic functions when PolyKinds is enabled? -


when enabling polykinds, valid type signatures can become invalid.

the following code compiles without polykinds.

{-# language kindsignatures #-} import ghc.generics  foo :: constructor c => t c (f :: * -> *) -> [char] foo = conname 

when enable polykinds fails compile.

kind incompatibility when matching types:   t0 :: * -> (* -> *) -> * -> *   t :: * -> (* -> *) -> k -> * expected type: t c f -> [char]   actual type: t0 c f a0 -> [char] relevant bindings include   foo :: t c f -> [char] (bound @ gen.hs:8:1) in expression: conname in equation ‘foo’: foo = conname 

is there way give type signature foo when polykinds enabled?

note discrepancy is

t0 :: * -> (* -> *) -> * -> * t :: * -> (* -> *) -> k -> * 

that is, in 1 of signatures ghc thinks third argument of t should have kind *, , in other thinks should have polymorphic kind k.

i think former signature (with *) comes conname, while latter k implicitly comes signature fook appears because have polykinds enabled, type signatures interpreted polymorphic kinds when possible. also, design, signature considered give the full "api" function, means no attempt infer kind rest of function done when specify signature explicitly.

in signature third argument of t type a, can fix adding kind annotation make consistent conname wants:

foo :: constructor c => t c (f :: * -> *) (a :: *) -> [char] foo = conname 

Comments

Popular posts from this blog

android - Gradle sync Error:Configuration with name 'default' not found -

java - Andrioid studio start fail: Fatal error initializing 'null' -

html - jQuery UI Sortable - Remove placeholder after item is dropped -