基本的にバイナリツリーであるデータ型を構築しようとしています。各ノードの左側のブランチは、各ノードの右側のブランチの変数に作用できる関数です。私はHaskellを初めて使用し、これが正しい方法で行われるかどうかはわかりませんが、現在の問題は、自分の型をShow型クラスに追加する方法がわからないことです。これが私の試みです:
{-# LANGUAGE ExistentialQuantification #-}
-- file: TS.hs
data TypeSentence a = forall b. Apply (TypeSentence (b->a)) (TypeSentence b)
| Expr a
instance (Show a) => (Show (TypeSentence a)) where
show (Expr x) = show x
show (Apply x y) = (show x) ++ " " ++ (show y)
instance (Show (TypeSentence b->a)) where
show (Expr x) = show "hello"
x = Expr 1
f = Expr (+1)
s = Apply f x
ただし、これをghciにロードすると、次のエラーが発生します。
TS.hs:9:24:
Could not deduce (Show (b -> a)) from the context ()
arising from a use of `show' at TS.hs:9:24-29
Possible fix:
add (Show (b -> a)) to the context of the constructor `Apply'
or add an instance declaration for (Show (b -> a))
In the first argument of `(++)', namely `(show x)'
In the expression: (show x) ++ " " ++ (show y)
In the definition of `show':
show (Apply x y) = (show x) ++ " " ++ (show y)
Failed, modules loaded: none.
Show(b-> a)宣言を追加する方法について何かアイデアはありますか?
ありがとう。