0

私は今この宿題をやっていますが、わかりません。誰かが私を助けることができますか?

HTML を表す次のデータ型があるとします。

type HTML = [HTML_element]
data HTML_element = HTML_text String
                  | HTML_font Font_tag HTML
                  | HTML_p HTML
                  | HTML_ul [HTML]
                  | HTML_ol [HTML]

data Font_tag = Font_size Int
              | Font_face String
              | Font_color Font_color

data Font_color = Colour_name String
                | Hex Int
                | RGB Int Int Int

Haskell 関数を書きます:

strip_font_tags :: HTML -> HTML

これにより、すべてのフォント タグが削除され、HTML コンテンツに置き換えられます。

4

2 に答える 2

5

ここにいる他の全員は、演習の要点を見逃していると思います。問題を解釈した後の私の思考プロセスは次のとおりです。おそらくこれはあなたを少し導くことができます。

一度に 1 つずつ操作することを考えHTML_elementたいので、ある時点で型を持つ関数が必要ですHTML_element -> ???。何???が起こるかを理解することは、大きな第一歩となります。最初の刺し傷はHTML_elementforを選択すること???ですが、font タグの内容は ではなく であるため、これはうまくいきHTMLませんHTML_element。うーん...また何HTMLですか?あ、はいtype HTML = [HTML_element]!したがって、実際にはHTML、それぞれの場合に を返すことができました。フォント以外の場合は、1 つの要素をシングルトン リストにまとめることができます。

うーん、しかし今何?要素ごとの関数を書いた今、私がやりたいことをする関数があるのだろうか...

于 2012-08-20T17:56:06.927 に答える
0

簡単な方法はHTML_element、別のものに置き換えることHTML_elementです — これは構造を維持する変換であり、おそらくデータを少し変更し、Functorインスタンスを作成してから使用することができますfmap— マッピングは、「それが の場合はHTML_font _ xeg を返しHTML_p x、そうでない場合はeg を返します。 、そのまま返す」。

これを SYB で表現すると次のようになります。

{-# LANGUAGE DeriveDataTypeable #-}
import Data.Generics

data Element
    = Text String
    | Font [Element]
    | Para [Element]
    deriving (Show, Typeable, Data)

-- replace Font with Para
replace' :: Element -> Element
replace' (Font x) = Para x
replace' x = x

-- top-level transformation
-- replace this with manual recursion and you're set
replace :: Element -> Element
replace = everywhere (mkT replace')

example =
    Para [
        Text "1",
        Font [
            Text "2.1",
            Para [
                Text "2.2.1",
                Font [Text "2.2.2"]
            ]
        ],
        Text "3"
    ] 

GHCiでは:

[*Main]
> replace example
Loading package syb-0.3.6.1 ... linking ... done.
Para [Text "1",Para [Text "2.1",Para [Text "2.2.1",Para [Text "2.2.2"]]],Text "3"]
it :: Element

これらの要素を完全に削除したい場合は、すべてをリストにマップしてから連結できる場合があります。自分でそれを理解してみてください。

于 2012-08-20T17:26:55.650 に答える