1

これらのデータ型を定義しました:

data Term = Symbol [Char] | Number [Int] 
data Exp = Fun (String, Term) | Exp (String, [Exp])

そして、いくつかの Show ルールを書きました:

instance Show Term where
  show (Symbol [x])     = [x]
  show (Symbol (x:xs))  = [x]++", "++(show (Symbol xs))

  show (Number [x])     = (show x)
  show (Number (x:xs))  = (show x)++", "++(show (Number xs))

instance Show Exp where
  show (Fun (name, args)) = name++"("++(show args)++")"
  show (Exp (name, args)) = name++"("++(show args)++")"

今私がさせたら:

bt = Exp("z", [Fun("f", Number [1,2,3]), Fun("g", Symbol ['a', 'b', 'c'])])

私が得るそれを示す:

z([f(1, 2, 3),g(a, b, c)])

私はこの表現をしたいと思います:

z(f(1, 2, 3),g(a, b, c))

つまり、内部に角括弧はありません。

誰かが私を助けることができますか?

これらのステートメントを追加しようとしました:

instance Show [Exp] where
  show [x]    = show x
  show (x:xs) = (show x)++(show xs)

しかしghci、それは法的コードに注意すると主張しています。

4

2 に答える 2

6

この行を変更するだけです:

  show (Exp (name, args)) = name++"("++(show args)++")"

...それは言うように:

  show (Exp (name, args)) = name++"("++(intercalate ", " . map show $ args)++")"

からの機能intercalateですData.List

于 2012-09-18T12:56:41.670 に答える
6

のインスタンスでshowList関数を定義できます。ShowExp

instance Show Exp where
  show (Fun (name, args)) = name++"("++(show args)++")"
  show (Exp (name, args)) = name++"("++(show args)++")"
  showList [] _ = ""
  showList [x] _ = show x
  showList (x:xs) _ = show x ++ "," ++ show xs
于 2012-09-18T13:47:38.927 に答える