K Kasshi
はじめまして、Kasshiと申します。
ある時Free Arrowをつかいたくなって次のようなコードを書いてみたのですが、
`{-# LANGUAGE RankNTypes #-}`
`import Control.Category hiding (id ,(.))`
`import qualified Control.Category as Cat`
`newtype A f a b = Arr {unA :: forall r. Arrow r => (forall x y. f x y -> r x y) -> r a b}`
`instance Category (A f) where`
`id = Arr $ const Cat.id`
`Arr g . Arr f = Arr $ \p -> f p >>> g p`
Categoryのidのconst関数のところでGHCに
> Couldn't match type 'b0' with 'forall x y. f x y -> r x y'
と怒られてしまいました。
そこで`const Cat.id` を`\ _ -> Cat.id` と書き換えるとコンパイルが通りました。
多相関数がうまく型推論されていないことが原因と思われますが、これは仕様なのかバグなのかが分かりません。
知見をお持ちの方はご意見頂けると幸いです。
ある時Free Arrowをつかいたくなって次のようなコードを書いてみたのですが、
`{-# LANGUAGE RankNTypes #-}`
`import Control.Category hiding (id ,(.))`
`import qualified Control.Category as Cat`
`newtype A f a b = Arr {unA :: forall r. Arrow r => (forall x y. f x y -> r x y) -> r a b}`
`instance Category (A f) where`
`id = Arr $ const Cat.id`
`Arr g . Arr f = Arr $ \p -> f p >>> g p`
Categoryのidのconst関数のところでGHCに
> Couldn't match type 'b0' with 'forall x y. f x y -> r x y'
と怒られてしまいました。
そこで`const Cat.id` を`\ _ -> Cat.id` と書き換えるとコンパイルが通りました。
多相関数がうまく型推論されていないことが原因と思われますが、これは仕様なのかバグなのかが分かりません。
知見をお持ちの方はご意見頂けると幸いです。