-3

宿題があります:

TTT1)各頂点に0、1、または2つの子があり、各ツリーリーフ(0の子とそれ自体を持つ頂点)に自然数のリストが含まれているツリーのデータ構造を定義します。

2)関数とベースツリーのmm2つの引数を持つ関数を作成します。結果として、リスト内の各要素(1を参照)の定義に関数を使用して作成されたベースツリーを提供する必要があります。f(Integer->Integer)TTTxTTTxf

関数fは次の表現(a、、bまたはc)を持つことができます。

a :: Integer -> Integer
a x = x * x

b :: Integer -> Integer
b x = x `mod` 9

c :: Integer -> Integer
c x = x * x * x

誰かがこれを手伝ってくれますか?

4

2 に答える 2

22

重要なアドバイス

Learn You a Haskell for Great Good に取り組む価値は十分にあります。素晴らしいチュートリアルです。

練習!遊ぶ!ブリーフを変更して、この割り当てを拡張します。整数の代わりに文字列に対してそれを行うことはできますか? 3 つのサブツリーを持つツリーを作成できますか? ブランチにもデータがある場合はできますか? 任意のデータ型を取るツリーを作成できますか? sについて調べてFunctorください。なぜ彼らは良いのですか?計算を表すツリーを作成できますか。枝は演算など+に、葉は数字に対応しますか?

プレイすればするほど、自信がつきます。何かが起こる前にそれを知ったクラスの男になりましょう。誰もがあなたに助けを求めますが、グループの誰かが抱えている難しい問題を解決するように求められると、さらに多くのことを学ぶことができます。

質問 1: ツリーのデータ型

ここにいくつかのヒントがあります。

このバイナリ ツリーには、2 つのサブツリーまたはブール リーフがあります。

data BTree = Leaf Bool | Branch BTree BTree 
  deriving (Eq,Show)

このデータ構造には、 のリストを含む 3 つの項目がありますBool

data Triple = Triple Int String [Bool]
  deriving (Eq,Show)

これは 3 つの異なる可能性がありExpr、右側に表示されるため、少し木に似ています。

data Expr = Var Char | Lam Char Expr | Let Char Expr Expr
  deriving (Eq,Show)

ここで、3 つの可能性を持つ 1 つが必要です。リーフには整数のリストがあり、他の 2 つには 1 つまたは 2 つのサブツリーがあります。例のアイデアをまとめます。

質問 2: ツリーに関数をマップする

これを、関数を「マップ」することができるあらゆる場所に関数を適用することと呼びます。mapリストに対してfmapそれを行い、他のものに対してそれを行います。

Bool -> Boolを受け取り、最初の例にマップする関数を定義しましょう。

mapBTree :: (Bool -> Bool) -> BTree -> BTree
mapBTree f (Leaf b) = Leaf (f b)
mapBTree f (Branch b1 b2) = Branch (mapBTree f b1) (mapBTree f b2)

もう 1 つはトリプルにマップされます。今回はBool、リスト内の各 で機能させる必要があります。

mapBoolTriple :: (Bool -> Bool) -> Triple -> Triple
mapBoolTriple f (Triple i xs bs) = Triple i xs (map f bs)

map次のように機能する標準関数を使用したことに注意してください。

map :: (a -> b) -> [a] -> [b]
map f [] = []
map f (x:xs) = f x : map f xs

したがって、リストの先頭から順に適用さfれます。x

私は本当にこの種のことをどのように行うか

しかし、これは私が実際にこれを行う方法ではありません。追加します

{-# LANGUAGE DeriveFunctor #-}

ファイルの先頭に

data BinTree a = ALeaf a | ABranch (BinTree a) (BinTree a)
   deriving (Eq, Show, Functor)

そして、私はできる

fmap (*100) (ABranch (ALeaf 12) (ALeaf 34))

それは私に与えるだろう

ABranch (ALeaf 1200) (ALeaf 3400)

しかし、fmapより柔軟です: 私も行うことができます

fmap (<20) (ABranch (ALeaf 12) (ALeaf 34))
  -- ABranch (ALeaf True) (ALeaf False)

また

fmap show (ABranch (ALeaf 12) (ALeaf 34))
 -- ABranch (ALeaf "12") (ALeaf "34")

関数を 1 行も書かずにfmap。追加の言語機能を使用する場合は 10/10 になりますが、設定どおりに問題を解決する場合は 0/10 になると思います。

さらなるアドバイス

楽しく Haskell を学びましょう。時には気が遠くなるようなこともあるかもしれませんが、学ぶことに対して大きな報酬を与えてくれます。Haskell でいくつかのプログラムを書くと、従来の言語で書いたプログラムよりも 10 分の 1 の長さになります。もっと考えて!書く量を減らしてください!

于 2012-11-05T22:27:26.997 に答える
0

Ingeterリストの代わりにリーフに1つのIntegerがあることを除いて、期待どおりに機能する場合、私はここまで来ました。私の質問は、リーフに整数リストのみを含めることができるように、このコードで何を変更する必要があるかということです。これまでのところ、ツリー定義を次のように変更してみました。

data TTT a = ALeaf [Integer] | ABranch (TTT a) (TTT a)

データを変更します。

testTree1 = ABranch (ALeaf [1,2,3]) (ALeaf [4,5,6])

ただし、その場合、整数リストは変更されません。

以下は、機能する葉に1つの整数を持つ安定したコードです。

{-# LANGUAGE DeriveFunctor #-}

data TTT a = ALeaf a | ABranch (TTT a) (TTT a)
   deriving (Eq, Show, Functor)

-- Function "mm"
mm f t = let
   in fmap (f) t

-- Function "tt_a"
tt_a = mm a testTree1

-- Function "tt_b"
tt_b = mm b testTree1

-- Function "tt_c"
tt_c = mm c testTree1

-- Function "a"
a :: Integer -> Integer
a x = x * x

-- Function "b"
b :: Integer -> Integer
b x = x `mod` 9

-- Function "c"
c :: Integer -> Integer
c x = x * x * x

-- TTT type tree`s for tests
testTree1 = ABranch (ALeaf 1) (ALeaf 2)
testTree2 = ABranch (ALeaf 11) (ALeaf 12)
于 2012-11-07T21:20:31.603 に答える