5

だから私は次のように定義されたツリーを持っています

data Tree a = Leaf | Node a (Tree a) (Tree a) deriving Show

Leaf を Leaf a と定義できることはわかっています。しかし、私は自分のノードに値を持たせたいだけです。私の問題は、検索を行うと、型の戻り値関数があることです

Tree a -> a

葉には価値がないので、葉に遭遇した場合は何もしないと言う方法がわかりません。試してみましnilた , " ",何もうまくいかないようです' '[]

コードを編集

data Tree a = Leaf | Node a (Tree a) (Tree a) deriving Show


breadthFirst   :: Tree a -> [a]
breadthFirst x =  _breadthFirst [x]

_breadthFirst    :: [Tree a] -> [a]
_breadthFirst [] =  []
_breadthFirst xs =  map treeValue xs ++
                _breadthFirst (concat (map immediateChildren xs))

immediateChildren                       :: Tree a -> [Tree a]
immediateChildren (Leaf)              =  []
immediateChildren (Node n left right) =  [left, right]

treeValue                         :: Tree a -> a
treeValue (Leaf)                =  //this is where i need nil
treeValue (Node n left right)   =  n

test = breadthFirst (Node 1 (Node 2 (Node 4 Leaf Leaf) Leaf) (Node 3 Leaf (Node 5 Leaf Leaf)))

main =
  do putStrLn $ show $ test
4

4 に答える 4

8

したがって、この場合の私の解決策は、Maybeandを使用することmapMaybeです。簡単に言えば、次のように変更treeValueします

treeValue                         :: Tree a -> Maybe a
treeValue (Leaf)                =  Nothing
treeValue (Node n left right)   =  Just n

map次に、これを結合するために を使用する代わりに、 mapMaybe(Data.Maybe から) を使用JustNothingます。

 mapMaybe treeValue xs

出来上がり!

Maybeは Haskell の言い方で、「何かに値がない可能性があります」であり、次のように定義されています。

data Maybe a = Just a | Nothing

これは、Nullable 型を持つことと道徳的に同等です。Haskell は、「null」の場合を処理する必要があるという事実を認識させるだけです。必要なときに、Data.Maybeには available などの便利な機能がたくさんありmapMaybeます。

于 2013-05-10T18:15:54.013 に答える