型クラスData.Foldableは、次のように定義されますfoldrが異なる型の引数をとるData.Foldableのインスタンスを定義することは可能ですか?
class Foldable t where
{-# MINIMAL foldMap | foldr #-}
foldMap :: Monoid m => (a -> m) -> t a -> m
foldr :: (a -> b -> b) -> b -> t a -> b
....
<more definitions>
最小限のスタンザは、私はそれだけでfoldr機能でインスタンスを定義することが可能だと言います。 私がコンパイルできるすべての例では、foldr関数の型はa -> a -> a
です。しかし、 は、foldr関数が実際にタイプa -> b -> b
であり、タイプがa
と の場合に定義することができません。
次のコードは、例を示し、それはコンパイルされません:
import Data.Foldable
data Tree a = Tree a a | Leaf a
class Size a where
size :: a -> Int
instance Size a => Foldable (Tree a) where
foldr :: a -> Int -> Int
foldr x n = size x + n
は、それがタイプa
とb
が本当に異なっているfoldr
、と折り畳み式のインスタンスを定義することは可能ですか?