折りたたみ式を実装したい
data Constant a b = Constant a
これは私の簡単な試みです:
instance Foldable (Constant a) where
foldr f b (Constant a) = f a b
私が理解したいコンパイルエラーの部分は次のとおりです。
Couldn't match expected type ‘a1’ with actual type ‘a’
‘a1’ is a rigid type variable bound by the type signature for
foldr :: (a1 -> b -> b) -> b -> Constant a a1 -> b
ご覧のとおり、折りたたみ関数は、a1
アクセスできない定数から「ファントム型」(?) を取得します。にしかアクセスできませんa
。
これを解決するにはどうすればよいですか?私はかなり混乱しているので、あなたの解決策を説明してください。
コンパイルエラー全体は次のとおりです。
try2/chap20/ex1.hs:9:30: Couldn't match expected type ‘a1’ with actual type ‘a’ …
‘a’ is a rigid type variable bound by
the instance declaration
at /Users/moron/code/haskell/book/try2/chap20/ex1.hs:8:10
‘a1’ is a rigid type variable bound by
the type signature for
foldr :: (a1 -> b -> b) -> b -> Constant a a1 -> b
at /Users/moron/code/haskell/book/try2/chap20/ex1.hs:9:3
Relevant bindings include
a :: a
(bound at /Users/moron/code/haskell/book/try2/chap20/ex1.hs:9:23)
f :: a1 -> b -> b
(bound at /Users/moron/code/haskell/book/try2/chap20/ex1.hs:9:9)
foldr :: (a1 -> b -> b) -> b -> Constant a a1 -> b
(bound at /Users/moron/code/haskell/book/try2/chap20/ex1.hs:9:3)
In the first argument of ‘f’, namely ‘a’
In the expression: f a b
Compilation failed.