Can I write a higher order type for a -> b -> *?

后端 未结 1 1806
自闭症患者
自闭症患者 2021-01-11 14:28

I understand that (->) a is a higher order type of kind * -> *, that when applied to a type argument b gives the type a -&

相关标签:
1条回答
  • 2021-01-11 15:13

    No, you can't. You could imagine many language features to support this; e.g. type-level lambdas would be a natural one:

    instance Functor (\c. a -> b -> c) where ...
    

    Unfortunately, type-level lambdas would mean we have to move from first-order unification to higher-order unification during type inference, which is notably difficult. (I want to say undecidable off the top of my head, but I'm not certain of this.)

    You can get halfway there if you insert an explicit type-checking hint by way of a newtype wrapper. The standard one is Compose:

    a -> b -> c ~= Compose (a ->) (b ->) c
    \c. a -> b -> c ~= Compose (a ->) (b ->)
    

    And, indeed, the Functor and Applicative instances for Compose (a ->) (b ->) are exactly the ones you would expect for \c. a -> b -> c, at the cost of a bit of syntactic noise when creating and consuming values of this type.

    0 讨论(0)
提交回复
热议问题