私はのハスケルプログラミングから私が正しくの質問1に答えていることを証明していませんでした。最後に、エクササイズのサブセクション以外の何かがあります。次の関数呼び出しは終了せず、それが予期しているかどうか、実装に問題があるかどうかはわかりません。再帰関数呼び出しが終了するか、その実装に誤りがありますか?
data BinaryTree a = Leaf
| Node (BinaryTree a) a (BinaryTree a)
deriving (Eq, Ord, Show)
unfold :: (a -> Maybe (a, b, a)) -> a -> BinaryTree b
unfold func seed =
case (func seed) of
Just (l, m, r) -> Node (unfold func l) m (unfold func r)
Nothing -> Leaf
私はそれがTrue
枝を取り、Nothing
/Leaf
を返すようにif
の原因となるまで、各a
/x
は、最終的にインクリメント/デクリメントされることをを思うだろう。
func = (\x -> if (x < 0 || x > 10)
then Nothing
else Just (x - 1, x, x + 1))
unfold func 5
-- Node (Node (Node (Node (Node (Node Leaf 0 ... ad infinitum
いい例。問題は、あなたが左の枝を取ることができ、次に右の枝を取ることができ、そして次に左と右を永遠に取ることができるということです。したがって、あなたは '5-1 + 1-1 + 1 .... 'それは無限に深い木を生成します。 – chi