あなたの言語は、あなたがプログラムが何をすべきだと思ったかについて、あなたが命令的思考の罠から逃れるために助けが必要であることを私に示唆しています。物事が何をしているのかではなく、物事が何であるかを考えることに基づいて、いくつかの助けを提供しようと思います。
のためfindpath (Leaf y) x
に、あなたは正しい方向に向かっています。あなたはただif
小文字を与える必要があります、そして正しいものi
が何であるかについて考える必要があります。Path
Leaf
それでは、他の可能性について考えてみましょう。あなたはそれ以上にそれがいくつかであることを知っていt
ます。あなたは本当に何を理解しようとしているのか知っています
findpath (Node l r) x
は(=
実際、それが何であるか)です。なぜなら、それは。のもう1つの可能性だからBTree
です。BTree
「これはa(Leaf y)
ですか(Node l r)
?」と尋ねて問題を分割することを考えてください。プログラム設計の1つの概念的なステップとして。さて、上記の左側が何に等しいかを理解するために、あなたは再帰的に計算された情報、すなわち何を受け取る権利があります
findpath l x
と
findpath r x
それは。とPath
の両方の情報を知っているなら、全体としては何であるかを言うことができますか?Haskellでそれを書くことによってその質問を言い換えさせてください:l
r
Path
Node l r
findpath :: Eq a => BTree a -> a -> Path
findpath (Leaf y) x = if y==x then ??? else Nothing
findpath (Node l r) x = nodepath (findpath l x) (findpath r x) where
nodepath :: Path -> Path -> Path
nodepath ???
再帰的に計算された情報を引数として取るヘルパー関数 を導入することで、私の質問を表現しました。これで、左右のサブツリーの2つのパスにそれぞれパターンマッチングを適用しnodepath
て実装を試みることができます。それらがであるかnodepath
どうかがわかっている場合は、ノード全体のパスがどうあるべきかを言うことができるはずです。(Just p)
Nothing
レッスン1、有用な考えは次の形式です。「これがそのようなものである場合、それはそのようなものでなければなりません。」している、していない。
レッスン2、データ型をプログラミングする基本的な方法は次のとおりです。コンストラクターの場合に分割します(Leaf
対Node
、Just
対Nothing
)。再帰呼び出しによってサブ構造から有用な情報を収集します。構造全体の値がどうあるべきかを言います。
私のアドバイスに従って、どうあるnodepath
べきかを理解すると、別の名前付き定義であることに値しないほど単純であることがわかるかもしれません。その場合は、nodepath
呼び出しをその意味に置き換えて、where
-clauseを切り取ります。しかし、それnodepath
は問題を解決するための有用な概念的なステップを表現しているので、導入することから始めるのは良いことです。