2013年2月2日土曜日

開発環境

Real World Haskell』(Bryan O'SullivanJohn GoerzenDon Stewart(著)、山下 伸夫伊東 勝利株式会社タイムインターメディア(翻訳)、オライリー・ジャパン、2009年、ISBN978-4-87311-423-3)の3章(型を定義し、関数を単純化する)の3.7(再帰型)の練習問題2.を解いてみる。

2.

最初に書いたの

コード(BBEdit)

sample.hs

-- file: sample.hs

data Tree a = Node a (Maybe (Tree a)) (Maybe (Tree a))
              deriving (Show)

simpleTree = Node "parent" (Just (Node "left leaf" Nothing Nothing))
                            (Just (Node "right leaf" Nothing Nothing))

入出力結果(Terminal)

$ ghci
GHCi, version 7.4.2: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :load sample.hs
[1 of 1] Compiling Main             ( sample.hs, interpreted )
Ok, modules loaded: Main.
*Main> simpleTree

<interactive>:3:1:
    Not in scope: `simpleTree'
    Perhaps you meant `siimpleTree' (line 6)
*Main> simpleTree

<interactive>:4:1:
    Not in scope: `simpleTree'
    Perhaps you meant `siimpleTree' (line 6)
*Main> :load sample.hs
[1 of 1] Compiling Main             ( sample.hs, interpreted )
Ok, modules loaded: Main.
*Main> simpleTree
Node "parent" (Just (Node "left leaf" Nothing Nothing)) (Just (Node "right leaf" Nothing Nothing))
*Main> :type simpleTree
simpleTree :: Tree [Char]
*Main> Node Nothing

<interactive>:8:1:
    No instance for (Show
                       (Maybe (Tree (Maybe a0))
                        -> Maybe (Tree (Maybe a0)) -> Tree (Maybe a0)))
      arising from a use of `print'
    Possible fix:
      add an instance declaration for
      (Show
         (Maybe (Tree (Maybe a0))
          -> Maybe (Tree (Maybe a0)) -> Tree (Maybe a0)))
    In a stmt of an interactive GHCi command: print it

これだと、2つの子(子自身も二分木)を持つノード、1つの子ノード、あるいは子ノードを持たないノードは作成出来るけど、空のノードは作成できない事に気づく。

ということで書き換えてみる。

コード(BBEdit)

sample.hs

-- file: sample.hs

data Tree a = Node (Maybe (a, (Tree a), (Tree a)))
                  deriving (Show)

emptyTree = Node Nothing
simpleTree = Node (
    Just ("parent", 
        (Node (Just ("left leaf", Node Nothing, Node Nothing))),
        (Node (Just ("right leaf", Node Nothing, Node Nothing)))
        ))

入出力結果(Terminal)

$ ghci
GHCi, version 7.4.2: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :load sample.hs
[1 of 1] Compiling Main             ( sample.hs, interpreted )
Ok, modules loaded: Main.
*Main> emptyTree
Node Nothing
*Main> :type it
it :: Tree a
*Main> simpleTree
Node (Just ("parent",Node (Just ("left leaf",Node Nothing,Node Nothing)),Node (Just ("right leaf",Node Nothing,Node Nothing))))
*Main> :type simpleTree
simpleTree :: Tree [Char]
*Main> empty = Node Nothing

<interactive>:7:7: parse error on input `='
*Main> let empty = Node Nothing
*Main> empty
Node Nothing
*Main> left = Node (Just ("left leaf", empty, empty))

<interactive>:10:6: parse error on input `='
*Main> let left = Node (Just ("left leaf", empty, empty))
*Main> left
Node (Just ("left leaf",Node Nothing,Node Nothing))
*Main> :type it
it :: Tree [Char]
*Main> let right = Node (Just ("right leaf", empty, empty))
*Main> :type right
right :: Tree [Char]
*Main> let parent = Node (Just("parent", left, right))
*Main> parent
Node (Just ("parent",Node (Just ("left leaf",Node Nothing,Node Nothing)),Node (Just ("right leaf",Node Nothing,Node Nothing))))
*Main> :type parent
parent :: Tree [Char]
*Main> :quit
Leaving GHCi.
$

これで空のノードも作成できるようになった。

0 コメント:

コメントを投稿