型に注意
超久々にSICPのエントリーを。というのも問題2.29で大苦戦したからである。
この問題のポイントは選択子や構成子など各関数の"型"を意識することが重要なのである。
maoe様のメモをそのまま下にコピペする。
total-weight :: mobile -> int left-branch :: mobile -> branch right-branch :: mobile -> branch branch-length :: branch -> int branch-structure :: branch -> int or mobile
つまり "total-weight"という関数はmobil型を引数にとり、int型を返す。
このように各変数の役割を理解した上で、何をインプットし、アウトプットするのかを考える必要がある。
"total-weight"には木全体を表すmobile型の値を引数にとる。
終了の条件はmobileにはもう、branchがついていないことを判定すればよい。
それはオモリの重さを表す整数型となるはずである。
また、整数型ではなかった場合にはさらにmobile型にはbranchが左右二つあるはずなので、
再帰的にそれぞれを探索すればよい。
関数total-weightは引数にmobile型をとるので
mobileの中の枝 -> branch(枝)のなかのmobile情報 -> 子どものmobile
という風に型を考えつつ次のmobileを渡してやる必要がある。
非常に骨が折れた。
一昨日の晩ご飯を思い出すよりよっぽど、頭の体操になりそうである。